PHP에서 출력 버퍼링은 개발자가 스크립트 출력 타이밍 및 순서를 제어 할 수있는 매우 실용적인 기능입니다. 기본적으로 PHP의 출력은 즉시 클라이언트로 전송되며 출력 버퍼링을 켜면 서버 메모리에서 이러한 출력을 먼저 저장 한 다음 필요에 따라 처리하거나 보낼 수 있습니다.
복잡한 캐시 제어 또는 다층 버퍼링 로직을 처리 할 때는 OB_List_HANDLERS () 기능의 사용을 이해하고 마스터하는 것이 중요합니다. 이 기사는 예제를 결합하여 OB_LIST_HANDLERS () 함수를 사용하여 출력 버퍼를보다 잘 관리하는 방법, 특히 여러 출력 프로세서 (예 : GZIP 압축, 템플릿 처리, 사용자 정의 캐시)가 중첩 될 때 설명하는 방법을 설명합니다.
OB_LIST_HANDLERS () 는 현재 활성화 된 모든 출력 버퍼 프로세서의 이름을 얻는 함수입니다. 리턴 값은 모든 현재 버퍼 프로세서를 스택 순서로 나열하는 배열입니다 (First in First Out).
array ob_list_handlers ( void )
출력 버퍼는 스택 구조로서 PHP에 존재한다. OB_START ()가 호출 될 때마다 새 프로세서가 스택 상단에 추가되며 데이터는 상단 레이어에서 하단 레이어로 처리됩니다.
이것은 다음을 의미합니다.
각 프로세서 계층은 수신 한 내용을 수정할 수 있습니다.
가장 낮은 버퍼 컨텐츠는 결국 클라이언트 또는 다른 대상으로 전송됩니다.
예를 들어:
ob_start('strtoupper'); // 3 층:콘텐츠를 자본으로 변환합니다
ob_start('trim'); // 2 층:시작을 제거하고 빈칸을 끝내십시오
ob_start(); // 1 층:독창적 인 콘텐츠
현재 OB_LIST_HANDLERS ()는 다음 내용을 반환합니다.
Array
(
[0] => default output handler
[1] => trim
[2] => strtoupper
)
GZIP 압축, HTML 압축 및 사용자 정의 로깅을 결합한 페이지 캐시 시스템을 개발한다고 가정하면 다음 버퍼 체인을 사용할 수 있습니다.
ob_start('ob_gzhandler'); // 층1:GZIP압축
ob_start('custom_html_minify'); // 층2:HTML압축
ob_start('log_output'); // 층3:벌채 반출
디버깅 또는 실행 중에 이러한 프로세서를 조정하려면 OB_LIST_HANDLERS ()를 사용하여 버퍼 스택의 구조를 결정한 다음 일부 처리 로직을 동적으로 닫거나 수정 또는 조정할 수 있습니다.
$handlers = ob_list_handlers();
foreach ($handlers as $handler) {
if ($handler === 'log_output') {
ob_end_flush(); // 또는 ob_end_clean(),비즈니스 요구에 따라 다릅니다
}
}
이는 특정 조건에서 로그 내용을 출력하거나 로깅을 비활성화하지 않습니다.
다음은 실제 시나리오에 더 가까운 예입니다. 정적 캐시 페이지 시스템의 출력 버퍼링 프로세스를 시뮬레이션합니다.
// 페이지 캐시 로직
function cache_page_output($buffer) {
$cache_file = '/tmp/page_' . md5($_SERVER['REQUEST_URI']) . '.html';
file_put_contents($cache_file, $buffer);
return $buffer;
}
// 注册输出缓冲층
ob_start('ob_gzhandler'); // GZIP압축
ob_start('cache_page_output'); // 파일로 캐시
ob_start(); // 원래 출력
echo "<html><body>방문에 오신 것을 환영합니다 <a href=\"https://gitbox.net/\">GitBox</a></body></html>";
// 현재 버퍼 프로세서를보십시오
print_r(ob_list_handlers());
출력은 비슷합니다.
Array
(
[0] => default output handler
[1] => cache_page_output
[2] => ob_gzhandler
)
현재 캐시를 일시적으로 건너 뛰는 것과 같이 필요에 따라 특정 버퍼 레이어를 종료 할 수 있습니다.
if ($_GET['nocache'] ?? false) {
ob_end_flush(); // 마치다 cache_page_output 这一층
}
스택 순서대로 항상 버퍼링 메커니즘을 이해하십시오. 마지막으로 켜진 마지막 프로세서는 데이터를 가장 먼저 처리하는 것입니다.
OB_LIST_HANDLERS ()를 사용하면 버퍼 레이어를 디버깅 할 때 큰 도움이 될 수 있습니다.
모든 버퍼를 완전히 정리하려면 (ob_get_level ()) ob_end_flush (); .
모든 출력 버퍼는 수동으로 () 또는 end_flush () 이어야한다는 것을 잊지 마십시오. 그렇지 않으면 스크립트가 끝나기 전에 내용이 전송되지 않을 수 있습니다.
복잡한 캐시 제어 시나리오에서 OB_LIST_HANDLERS ()는 PHP 출력 버퍼 계층을 시각적으로 지원하여 개발자가 각 레이어의 동작을 유연하게 관리 할 수 있도록합니다. OB_START () 및 OB_END_FLUSH () 와 같은 기능을 결합하면 압축, 캐싱, 로깅, 필터링 등에 대한 다층 출력 체인을 실현하여 유연하고 제어 가능한 출력 전략을 수립 할 수 있습니다.
출력 버퍼링 메커니즘 및 OB_LIST_HANDLERS () 를 사용하면 특히 미들웨어 기반 구조를 구축 할 때보다 효율적이고 디지털화 가능하며 확장 가능한 PHP 응용 프로그램을 구축 할 수 있습니다.