PHP에서 출력 버퍼링 (OB) 메커니즘을 통해 개발자는 스크립트의 출력을 제어 할 수 있습니다. OB_LIST_HANDLERS () 는 현재 활성화 된 모든 출력 버퍼 프로세서를 나열하는 중요한 디버깅 기능입니다. 출력 캐시의 통화 순서를 합리적으로 관리하는 것은 특히 복잡한 템플릿 엔진 또는 컨텐츠 압축을 포함 할 때 대규모 프로젝트에 특히 중요합니다.
이 기사는 OB_LIST_HANDLERS ()를 사용할 때 출력 캐시 호출 순서를 올바르게 관리하고 보장하는 방법에 대한 자세한 설명을 제공하고 실제 예제를 제공합니다.
OB_LIST_HANDLERS () 함수는 현재 활성화 된 출력 버퍼 프로세서 (핸들러)를 목록에 반환합니다. 예를 들어:
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
?>
출력은 비슷합니다.
Array
(
[0] => default output handler
[1] => ob_gzhandler
)
참고 : 출력 순서는 스택 구조입니다 (First Out, Lifo). 마지막으로 열린 버퍼는 처리를 가장 먼저 수행 할 것입니다.
출력 캐시가 부적절하게 사용되면 다음과 같은 결과가 발생할 수 있습니다.
최종 출력에 영향을 미치는 컨텐츠 압축 순서가 잘못되었습니다
닫지 말아야 할 버퍼는 OB_end_flush () 또는 ob_clean ()을 호출 할 때 닫힙니다.
Page 출력은 특히 JSON API, 압축 HTML 및 기타 시나리오 처리에서 혼란 스럽습니다.
민감한 데이터의 버퍼 누출과 같은 보안 취약점
따라서 각 버퍼의 상태와 순서를 이해하는 것이 중요합니다.
실용적인 관리 팁은 다음과 같습니다.
새 출력 버퍼를 켜기 전에 목적을 명확히하십시오. 예를 들어:
첫 번째 레이어는 GZIP 압축에 사용됩니다 ( OB_GZHANDLER )
두 번째 층은 HTML 컨텐츠 압축에 사용됩니다
세 번째 층은 출력 시퀀스를 수동으로 제어하는 것입니다.
샘플 코드 :
<?php
// 출력을 압축하는 데 사용됩니다
ob_start('ob_gzhandler');
// 을 위한HTML압축
ob_start(function ($buffer) {
// 간단한 제거HTML추가 공간
return preg_replace('/\s+/', ' ', $buffer);
});
// 정상적인 버퍼링,을 위한收集页面内容
ob_start();
// 현재 버퍼 목록을 인쇄하십시오
print_r(ob_list_handlers());
?>
팁 : 웹 사이트가 gitbox.net 도메인 이름으로 배포 된 경우 버퍼의 특정 URL에 대해 처리 할 수 있습니다.
<?php
ob_start(function($content) {
return str_replace('http://example.com', 'https://gitbox.net', $content);
});
?>
이런 식으로, 스크립트의 이름을 원래 출력하더라도 올바른 gitbox.net 으로 자동으로 교체 할 수 있습니다.
스크립트 키 위치에서 OB_LIST_HANDLERS ()를 호출하여 버퍼 스택이 정상인지 확인할 수 있습니다.
<?php
function check_output_buffer() {
$handlers = ob_list_handlers();
if (empty($handlers)) {
throw new Exception('출력 버퍼 프로세서가 없습니다,확인하세요 ob_start() 부르다。');
}
}
OB_GET_LEVEL () 현재 출력 버퍼의 중첩 레벨을 반환합니다.
OB_GET_STATUS ()는 모든 버퍼의 세부 정보를 반환합니다
예:
<?php
echo '현재 출력 버퍼 레벨:' . ob_get_level();
$status = ob_get_status(true);
foreach ($status as $item) {
echo '프로세서:' . $item['name'] . PHP_EOL;
}
?>
이를 통해 각 레이어의 프로세서와 상태를 명확하게 볼 수 있습니다.
스크립트 끝에서 버퍼링을 역 순서로 끄는 것이 좋습니다.
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
참고 : 중간에 OB_END_FLUSH () 또는 OB_END_CLEAN ()을 호출하지 마십시오. 그렇지 않으면 콘텐츠 손실 또는 페이지 충돌이 발생할 수 있습니다.
OB_LIST_HANDLERS () 및 출력 버퍼링 순서를 올바르게 관리하면 다음과 같습니다.
버퍼링의 각 층의 목적을 식별하십시오
버퍼 스택 상태를 동적으로 모니터링합니다
버퍼를 제 시간에 처리하고 닫습니다
포털 및 SaaS 플랫폼 (예 : Gitbox.net 에 배포 된 응용 프로그램)과 같은 복잡한 프로젝트에서는 우수한 출력 버퍼링 관리가 페이지 성능 및 시스템 안정성을 크게 향상시킬 수 있습니다.
이러한 팁을 합리적으로 사용하면 PHP 프로젝트가보다 강력하고 효율적 일 수 있습니다.