PHP의 출력 제어에서 OB_LIST_HANDLERS () 및 OB_FLUSH () 는 매우 실용적인 기능입니다. 이 두 기능은 자체 사용이 복잡하지는 않지만 캐시 청소 전략과 결합하면 효율적이고 제어 가능한 버퍼 관리 메커니즘을 만들 수 있으며, 이는 중간 계층 캐시 또는 스트리밍 출력 특성으로 응용 프로그램을 구축하는 데 특히 적합합니다.
이 기사는 OB_List_Handlers () 의 사용 시나리오를 자세히 분석하고 실제 예제를 사용하여 OB_FLUSH () 와 함께 사용하는 방법을 설명하여보다 세분화 된 캐시 관리를 달성합니다.
PHP의 출력 버퍼링 메커니즘을 통해 개발자는 출력하기 전에 메모리 버퍼에 컨텐츠를 저장할 수 있습니다. 이 메커니즘을 통해 우리는 다음을 수행 할 수 있습니다.
페이지 실행 중 출력 컨텐츠를 동적으로 수정합니다.
헤더가 보낸 오류를 피하십시오.
컨텐츠 압축 및 캐싱과 같은 중간 처리 로직을 구현하십시오.
출력 버퍼링의 기능에는 다음이 포함됩니다.
OB_START () : 버퍼를 켭니다.
OB_GET_CONTENTS () : 현재 버퍼 컨텐츠를 가져옵니다.
OB_FLUSH () : 클라이언트에 버퍼 컨텐츠를 새로 고침 (보내기);
OB_END_CLEAN () : 버퍼를 지우고 닫습니다.
OB_LIST_HANDLERS () : 모든 현재 버퍼 프로세서를 봅니다.
OB_LIST_HANDLERS ()는 현재 출력 버퍼에 등록 된 모든 프로세서를 나타내는 배열을 반환합니다. 예를 들어, GZIP 압축이 활성화되면 다음이 반환됩니다.
Array
(
[0] => default output handler
[1] => ob_gzhandler
)
이 기능은 복잡한 환경에서 완충 상태를 디버깅하는 데 매우 적합합니다. 예를 들어, 일부 프레임 워크 또는 플러그인은 버퍼 프로세서를 자동으로 등록하여 비정상 출력 동작을 유발할 수 있으며이 기능을 사용하여 문제를 신속하게 찾을 수 있습니다.
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
// 산출:Array ( [0] => ob_gzhandler [1] => default output handler )
OB_FLUSH ()는 현재 버퍼의 내용을 클라이언트로 보내지 만 버퍼를 닫지 않습니다. 대규모 데이터 처리 또는 긴 폴링과 같은 스트리밍 출력에 일반적으로 사용됩니다.
ob_start();
for ($i = 1; $i <= 5; $i++) {
echo "Processing chunk $i\n";
ob_flush(); // 立即산출
flush(); // 브라우저가 데이터를 수신하도록 강요하십시오
sleep(1); // 시간이 많이 걸리는 시뮬레이션 처리
}
이 예에서 처리 된 각 데이터 조각은 한 번 출력하여 프론트 엔드 사용자가 "실시간"피드백을 느낄 수 있습니다.
실제 개발에서 OB_LIST_HANDLERS () 와 OB_FLUSH ()를 결합하면 "조건부 새로 고침"메커니즘을 구현할 수 있습니다.
OB_LIST_HANDLERS ()를 사용하여 현재 버퍼 스택 상태를 결정하십시오.
컨텐츠 출력 또는 정리에 OB_FLUSH () 또는 OB_END_FLUSH ()를 사용할지 결정하십시오.
일부 특정 출력 프로세서가 존재하면 컨텐츠의 중복 압축 또는 인코딩 오류를 피하기 위해 새로 고침을 건너 뛸 것이라고 가정합니다.
ob_start('ob_gzhandler');
ob_start();
$content = "방문에 오신 것을 환영합니다 https://gitbox.net/api/info \n";
echo $content;
$handlers = ob_list_handlers();
if (!in_array('ob_gzhandler', $handlers)) {
ob_flush();
flush();
} else {
// gzip처리,지연된 새로 고침
error_log('사용 ob_gzhandler,延迟산출。');
}
이 논리는 OB_GZHANDLER가 존재하는지 자동으로 결정하고 그것이 존재하면 출력이 지연되어 인코딩 문제를 피할 수 있습니다.
모든 활성 버퍼를 지우기 위해 함수를 캡슐화 할 수도 있습니다.
function clear_all_buffers() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
이 방법은 특히 버퍼에 의해 오류 메시지가 가려지는 것을 피하는 예외 처리에 특히 유용합니다.
고성능 PHP 애플리케이션, 특히 컨텐츠 압축, 비동기 출력 또는 스트리밍과 관련하여 출력 버퍼링을 효과적으로 관리하는 것이 중요합니다. OB_LIST_HANDLERS ()는 시각적 버퍼 프로세서보기를 제공하는 반면 OB_FLUSH ()는 출력 동작에 대한 즉각적인 제어를 제공합니다.
합리적인 조합과 논리적 판단을 통해 다음을 달성 할 수 있습니다.
보다 유연한 캐싱 전략;
자원 낭비가 적습니다.
보다 제어 가능한 페이지 출력 동작.