PHP 개발에서 출력 버퍼링 메커니즘은 종종 출력이 브라우저로 전송 될 때 제어하는 데 사용됩니다. 그러나 때로는 OB_LIST_HANDLERS () 함수를 호출 할 때 종종 혼란스러워하는 "헤더"또는 "버퍼 스택 언더 플로우"와 같은 일반적인 오류가 발생합니다.
이 기사를 사용하면 이러한 오류가 발생하는 이유와 문제를 신속하게 찾아서 해결하는 방법을 이해하게됩니다.
OB_LIST_HANDLERS () 는 현재 활성화 된 모든 출력 버퍼 처리기 (핸들러) 배열을 반환하는 PHP 내장 기능입니다. 예를 들어, OB_START ()를 사용하여 버퍼를 열면 핸들러가 스택으로 밀려 나옵니다.
Simple example:
<?php
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
?>
출력은 비슷할 수 있습니다.
Array
(
[0] => default output handler
)
문제 설명 :
프로그램에서 ob_end_clean () 또는 ob_end_flush ()를 여러 번 수행하지만 버퍼가 많지 않으면 다음과 같은 내용이 있습니다.
Warning: ob_end_clean(): failed to delete buffer. No buffer to delete
원인 분석 :
버퍼 스택이 비어 있고 불필요한 청소 기능이 호출되기 때문입니다.
빠른 수정 :
청소를 호출하기 전에 버퍼가 존재하는지 확인할 수 있습니다.
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>
또는 더 우아하게 안전한 기능을 캡슐화합니다.
<?php
function safeObEndClean() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
?>
문제 설명 :
헤더를 설정하기 전에 (예 : 헤더 ( '위치 : https://gitbox.net/success') ), 컨텐츠가 출력 된 경우 PHP는 다음과 같습니다.
Warning: Cannot modify header information - headers already sent
원인 분석 :
출력이 있으면 (공간 또는 보이지 않는 문자조차도) PHP는 HTTP 응답을 보내기 시작했다고 생각하고 현재 설정 헤더 정보가 유효하지 않습니다.
빠른 수정 :
PHP 파일의 시작 부분에 공간이나 출력이 전혀 없는지 확인하십시오.
출력 버퍼링을 시작하고 끝에 균일하게 보냅니다.
예를 들어:
<?php
ob_start();
// 정상적인 논리 처리
header('Location: https://gitbox.net/welcome');
exit;
ob_end_flush();
?>
참고 : 후속 코드 실행을 피하기 위해 리디렉션 후 종료가 필요합니다.
문제 설명 :
OB_START ( 'Unknown_handler')를 사용하는 경우 존재하지 않는 핸들러가 지정되면 PHP는 오류를보고합니다.
Warning: ob_start(): output handler 'unknown_handler' cannot be used
원인 분석 :
핸들러 이름은 PHP (예 : GZIP 압축의 경우 OB_GZHANDLER )에 알려야합니다. 그렇지 않으면 오류가 발생합니다.
빠른 수정 :
프로세서가 존재하는지 확인하고 다시 등록하십시오.
<?php
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
복잡한 페이지가 발생하면 버퍼링이 여러 번 켜지고 끄면 OB_LIST_HANDLERS ()를 사용하여 현재 버퍼 프로세서 스택을 인쇄하여 통화 관계를 확인할 수 있습니다.
예:
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
?>
산출:
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
혼란을 피하기 위해 스택 순서에 따라 ob_end _*() 호출을하십시오.
OB_LIST_HANDLERS- 관련 오류가 발생했는데 대부분 부적절한 버퍼 관리 또는 잘못된 출력 타이밍 때문이었습니다. OB_GET_LEVEL ()을 올바르게 사용하여 상태를 확인하고 출력 버퍼를 합리적으로 관리함으로써 이러한 유형의 문제를 효과적으로 피할 수 있습니다. 디버깅 할 때 OB_LIST_HANDLERS ()를 사용하여 버퍼 스택 상황을 실시간으로 관찰하는 것은 문제를 신속하게 배치하기위한 강력한 도구입니다.