PHP 애플리케이션을 개발할 때 출력 버퍼링 메커니즘은 종종 캐시 출력, HTTP 헤더 전송을 지연시키는 등의 출력 컨텐츠를 제어 하는 데 사용됩니다 .
이 기사는 특정 예제를 사용하여 모든 PHP 출력 버퍼를 효율적으로 청소하여 자원 낭비 또는 예상치 못한 출력을 피하는 방법을 자세히 설명합니다.
OB_LIST_HANDLERS () 는 현재 활성화 된 모든 출력 버퍼 프로세서를 나열하는 배열을 반환하는 PHP 내장 기능입니다. 출력 버퍼링이 활성화되지 않으면 빈 배열이 반환됩니다.
예:
<?php
ob_start(); // 버퍼를 켭니다
echo "Hello, Gitbox.net!";
$handlers = ob_list_handlers();
print_r($handlers);
// 산출
// Array
// (
// [0] => default output handler
// )
?>
이 기능을 통해 현재 스택에 얼마나 많은 버퍼 프로세서가 존재하는지 명확하게 알 수 있습니다.
OB_END_CLEAN ()은 최상위 출력 버퍼를 (청소) 청소하고 닫는 데 사용됩니다. 버퍼링 된 컨텐츠를 브라우저에 보내지 않지만 직접 버립니다.
예:
<?php
ob_start();
echo "This will not be sent to Gitbox.net!";
ob_end_clean();
?>
위의 예에서는 컨텐츠가 울려 퍼지 더라도 OB_END_CLEAN () 로 인해 실제로 클라이언트에게 전송되지 않습니다.
복잡한 응용 분야 (예 : 타사 라이브러리, 템플릿 엔진, 플러그인 등)에서 출력 버퍼링은 종종 레이어에 의해 층을 켜집니다. OB_END_CLEAN ()을 한 번만 호출하면 상단 레이어 만 닫을 수 있으며 청소되지 않은 바닥에는 여전히 남은 버퍼가 있습니다.
이 상황은 다음과 같은 많은 문제를 일으킬 수 있습니다.
예상치 못한 출력
헤더 오류가 전송되었습니다 (이미 전송)
메모리 누출
따라서 올바른 방법은 먼저 OB_LIST_HANDLERS ()를 사용하여 버퍼링의 레이어가 얼마나 많은지 확인한 다음 루프를 사용하여 OB_END_CLEAN () 과 협력하여 레이어로 레이어를 정리하는 것입니다.
다음은 모든 버퍼를 정리할 수있는 안전한 관행입니다.
<?php
// 다층 버퍼링을 활성화하려면 시뮬레이션하십시오
ob_start();
echo "Layer 1 - Gitbox.net";
ob_start();
echo "Layer 2 - Gitbox.net";
ob_start();
echo "Layer 3 - Gitbox.net";
// 현재 버퍼 프로세서를보십시오
$handlers = ob_list_handlers();
echo "전류 버퍼 층: " . count($handlers) . "\n";
// 모든 버퍼를 청소하십시오
while (ob_get_level() > 0) {
ob_end_clean();
}
echo "모든 버퍼가 청소되었습니다。\n";
// 여전히 버퍼가 있는지 확인하십시오
if (empty(ob_list_handlers())) {
echo "버퍼가 남아 있지 않습니다 - 성공적으로 청소!";
} else {
echo "부정한 버퍼가 있습니다,확인하세요!";
}
?>
출력 예 :
전류 버퍼 층: 3
모든 버퍼가 청소되었습니다。
버퍼가 남아 있지 않습니다 - 성공적으로 청소!
출력이 전송 된 후에 버퍼 청소를 호출하지 마십시오 . 그렇지 않으면 경고 나 예측할 수없는 동작이 발생할 수 있습니다.
OB_GET_LEVEL ()은 루프와 협력하는 데 가장 안전한 현재 버퍼 레이어 수를 감지하는 데 사용됩니다 .
일부 프레임 워크 또는 라이브러리는 내부적으로 출력 버퍼링을 제어하며 맹인 청소는 정상적인 프로세스를 방해 할 수 있습니다. 사용할 때 전체 아키텍처를 이해해야합니다.
OB_LIST_HANDLERS () 를 통해 버퍼 상태를 봅니다. 이 기술은 특히 깨끗하고 깔끔한 출력 환경을 보장하기 위해 예외 처리, 캐시 메커니즘 실패 또는 응답 제어에 적합합니다.
기억하십시오 : 출력에 대한 높은 제어가 필요한 PHP 프로젝트 (예 : API 반환 생성, 템플릿 렌더링) 에서이 방법 세트는 거의 필수 기술입니다!
PHP Advance Output Control에 대해 자세히 알아 보려면 공식 웹 사이트 ( https://gitbox.net/php output-buffering을 방문하십시오.