PHP의 출력 버퍼링 메커니즘을 사용할 때는 종종 OB_START () 및 OB_GET_CONTENTS () 와 같은 기능을 사용하여 컨텐츠의 출력을 제어합니다. 이 도구는 템플릿 엔진, 캐시 생성, 페이지 압축 및 기타 시나리오에서 매우 일반적입니다. 그러나 우연히 처리되면 캐시 된 컨텐츠가 여러 번 출력 될 수 있으므로 페이지의 정상 표시에 영향을 미칩니다.
실용적이지만 쉽게 간과되는 기능 중 하나는 OB_List_Handlers () 입니다. 현재 활성화 된 모든 버퍼 핸들러를 보는 데 도움이됩니다. 올바르게 사용하면 출력 버퍼가 반복적으로 출력되는 문제를 효과적으로 피할 수 있습니다.
PHP의 출력 버퍼를 사용하면 수동 플러시가 완료되거나 스크립트가 균일하게 출력 될 때까지 출력 컨텐츠를 메모리에 저장할 수 있습니다. 이것은 우리를 도울 수 있습니다 :
컨텐츠를 출력하기 전에 HTTP 헤더 정보를 수정합니다.
제어 캐시 된 컨텐츠;
출력 컨텐츠를 압축하거나 필터링하십시오.
기본 사용 예제는 다음과 같습니다.
ob_start();
echo "Hello, World!";
$content = ob_get_contents();
ob_end_clean();
이 코드에서 "안녕하세요, 세계!" 버퍼에 출력 한 다음 변수 $ 컨텐츠 로 추출되며 직접 출력을 피하기 위해 OB_END_CLEAN () 을 통해 버퍼가 지워집니다.
OB_LIST_HANDLERS ()는 모든 현재 출력 버퍼 프로세서 이름을 반환합니다. 이는 중복 출력 문제를 해결하는 강력한 도구입니다.
예를 들어:
ob_start();
ob_start('ob_gzhandler');
print_r(ob_list_handlers());
출력은 다음과 같습니다.
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
각 프로세서는 스택 방식으로 버퍼링 된 출력을 처리합니다. 이전 버퍼를 청소하지 않으면 내용이 반복적으로 압축되거나 출력 될 수 있습니다.
복잡한 프로젝트에서는 여러 구성 요소를 사용하는 경향이 있으며, 모두 자체 출력 버퍼링을 켜질 수 있습니다. 버퍼 레벨이 통일되지 않으면 다음과 같은 문제가 쉽게 발생합니다.
캐시 컨텐츠 출력 여러 번;
출력 순서는 일관성이 없습니다.
버퍼링이 올바르게 닫히지 않으면 메모리 누출이 발생합니다.
OB_GET_LEVEL ()을 사용하여 현재 버퍼 레벨을 감지하고 반복적 인 통화를 피하십시오.
if (ob_get_level() === 0) {
ob_start();
}
특정 프로세서가 활성화되었는지 여부를 감지하기 위해 도우미 기능을 작성할 수 있습니다.
function has_ob_handler($handler_name) {
return in_array($handler_name, ob_list_handlers());
}
if (!has_ob_handler('ob_gzhandler')) {
ob_start('ob_gzhandler');
}
이 코드는 OB_GZHANDLER가 반복적으로 등록되는 것을 방지하여 GZIP에 의해 출력이 여러 번 압축되는 것을 피합니다.
어떤 버퍼가 켜져 있는지 확실하지 않은 경우 다음 방법을 사용하여 지우실 수 있습니다.
while (ob_get_level() > 0) {
ob_end_clean();
}
이것은 종종 중첩 버퍼 레벨이 문제를 일으키지 않도록 프레임 워크 또는 핵심 컨트롤러에 사용됩니다.
$url = 'https://gitbox.net/cache/homepage.html';
// 버퍼링을 시작하십시오
if (ob_get_level() === 0) {
ob_start();
}
// 아날로그 컨텐츠 출력
echo "<h1>방문에 오신 것을 환영합니다 Gitbox</h1>";
// 캐시 된 컨텐츠를 저장하십시오
$content = ob_get_contents();
file_put_contents('/path/to/cache/homepage.html', $content);
// 엔드 버퍼링,출력 내용
ob_end_flush();
스크립트가 여러 번 (예 : 템플릿 시스템에서와 같이) 호출되는 경우 버퍼링을 시작하기 전에 OB_LIST_HANDLERS () 점검을 추가하여 버퍼링이 다시 시작되지 않았는지 확인하고 여러 출력 또는 캐시 된 컨텐츠의 예외를 피할 수 있습니다.
OB_LIST_HANDLERS ()를 사용하면 현재 출력 버퍼링 상태를 명확하게 이해할 수 있으며 캐시 된 중복 출력 문제를 찾아서 고정하는 데 중요한 도구입니다. OB_GET_LEVEL () 및 OB_END_CLEAN () 과 같은 기능을 사용하면 PHP의 출력 버퍼링을보다 안전하고 효율적으로 관리 할 수 있습니다. 특히 템플릿 엔진을 사용할 때, 페이지 캐시를 작성하거나 GZIP 출력을 처리 할 때.
충돌의 위험을 줄이고 콘텐츠 출력을보다 제어 가능하고 효율적으로 만들기 위해 대규모 프로젝트 또는 다중 모전 시스템의 출력 버퍼링 로직을 통합하는 것이 좋습니다.
참조로 완전한 버퍼 관리 클래스 캡슐화를 제공해야합니까?