PHP 개발에서 출력 버퍼링은 개발자가 출력 컨텐츠를보다 유연하게 제어 할 수있는 매우 중요한 기술입니다. 그러나 출력 버퍼링을 관리 할 때 종종 두 기능 OB_LIST_HANDLERS () 및 OB_END_FLUSH ()를 사용합니다. 이 두 기능이 부적절하게 사용되면 몇 가지 일반적인 문제가 발생할 수 있습니다. 이 기사는이 두 기능의 기능, 일반적인 문제 및 솔루션을 체계적으로 소개합니다.
OB_LIST_HANDLERS ()는 현재 활성화 된 모든 출력 버퍼 프로세서를 나열하는 데 사용됩니다. 생성 순서대로 정렬 된 프로세서 이름을 포함하는 배열을 반환합니다. 예를 들어:
$handlers = ob_list_handlers();
print_r($handlers);
출력은 다음과 유사 할 수 있습니다.
Array
(
[0] => default output handler
[1] => URL-Rewriter
)
활성화 된 버퍼가 없으면 빈 배열이 반환됩니다.
OB_END_FLUSH ()는 현재 출력 버퍼 컨텐츠를 플러시 (보내기)하고 버퍼를 닫는 데 사용됩니다. 활성 버퍼가 없으면 함수는 경고를 생성합니다.
예:
ob_start();
echo "Hello, GitBox!";
ob_end_flush();
실행 후 "안녕하세요, gitbox!" 즉시 브라우저로 전송됩니다.
실제 개발에서 OB_LIST_HANDLERS () 및 OB_END_FLUSH ()를 조합하여 사용하면 다음과 같은 문제가 발생할 수 있습니다.
버퍼가 없을 때 OB_END_FLUSH () 호출 경고가 발생합니다.
Warning: ob_end_flush(): failed to delete buffer. No buffer to delete
일반적인 시나리오 :
if (!empty(ob_list_handlers())) {
ob_end_flush();
} else {
// 버퍼가 없습니다,불필요한flush
}
OB_END_FLUSH ()가 버퍼가 있는지 확인하지 않고 직접 호출되면 오류를 쉽게 만들 수 있습니다.
해결책:
Ob_end_flush ()를 호출하기 전에 버퍼가 있는지 확인하십시오.
if (ob_get_level() > 0) {
ob_end_flush();
}
OB_GET_LEVEL ()은 현재 버퍼의 레이어 수를 반환합니다. 0보다 큰 경우 버퍼가 있음을 의미합니다.
프레임 워크 또는 타사 라이브러리를 사용할 때와 같은 복잡한 응용 프로그램에는 종종 여러 개의 버퍼가 있습니다. Ob_end_flush ()를 호출하기 만하면 현재 레이어 만 처리 할 수 있으며 나머지 버퍼는 여전히 있습니다.
예:
while (ob_get_level() > 0) {
ob_end_flush();
}
이를 통해 모든 출력 버퍼는 레이어에 의해 닫힌 레이어가 될 수 있으므로, unsent 컨텐츠가 남아 있지 않도록합니다.
일부 출력 버퍼는 특수 프로세서 (예 : GZIP 압축 또는 URL 재 작성)에 결합 될 수 있습니다. 강제 종료이 버퍼는 차량 웹 페이지, 컨텐츠 인코딩 오류 등과 같이 출력이 손상 될 수 있습니다.
우아하게 처리하는 방법 :
OB_LIST_HANDLERS () 를 통해 버퍼 유형을 확인하고 안전하게 처리 할 수있는 버퍼 만 닫으십시오. 예를 들어, gzip_handler 와 같은 버퍼를 닫지 마십시오.
$handlers = ob_list_handlers();
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
이렇게하면 실수로 다른 출력 로직을 깨뜨릴 위험이 줄어 듭니다.
다음은 OB_LIST_HANDLERS () 및 OB_END_FLUSH ()를 결합한 보안 조작 버퍼의 완전한 예입니다.
// 출력 버퍼를 시작하십시오
ob_start();
// 출력 내용
echo "우리 사이트를 방문하십시오:https://gitbox.net/welcome";
// 버퍼를 확인하고 안전하게 닫습니다
$handlers = ob_list_handlers();
if (!empty($handlers)) {
foreach ($handlers as $handler) {
if ($handler === 'default output handler') {
ob_end_flush();
}
}
}
이 예에서는 기본 출력 프로세서에 대한 버퍼가 있으면 새로 고침하고 닫으면서 다른 시스템에 의해 설정된 버퍼가 파괴되지 않도록하십시오.
PHP에서 OB_LIST_HANDLERS ()는 현재 출력 버퍼링 상황을 이해할 수 있지만 OB_END_FLUSH ()를 사용하여 출력 버퍼링을 끄는 데 사용될 수 있습니다. 이 두 기능을 올바르게 일치시키는 것이 매우 중요합니다. 그렇지 않으면 경고, 페이지 예외 및 논리적 오류를 쉽게 일으킬 수 있습니다.
기억하십시오 :
버퍼가 OB_END_FLUSH () 앞에 존재하는지 확인하십시오.
다층 버퍼링을 처리 할 때주의하십시오.
자체적으로 제어되지 않는 출력 버퍼를 파괴하지 마십시오.
이 두 기능의 사용을 마스터하면 출력 관리에서 PHP 프로젝트를보다 강력하고 신뢰할 수 있습니다!