PHP의 출력 제어 메커니즘에서 OB_LIST_HANDLERS () 및 OB_END_CLEAN () 은 두 가지 일반적이지만 완전히 다른 기능입니다. 차이점과 올바른 사용 시나리오를 이해하는 것은 코드 실행 프로세스를 최적화하고 출력 오류를 피하는 데 특히 중요합니다.
OB_LIST_HANDLERS () 는 현재 활성화 된 모든 출력 버퍼 프로세서의 이름 목록을 반환하는 쿼리 기능입니다. 이 기능은 출력 버퍼의 내용을 수정 하지 않지만 현재 버퍼 스택 상태를 보는 데만 사용됩니다.
문법:
$handlers = ob_list_handlers();
print_r($handlers);
예로 돌아갑니다 :
Array
(
[0] => default output handler
)
OB_START () 로 캐시를 여러 번 시작하는 것과 같은 다중 계층 버퍼링을 활성화하면 OB_LIST_HANDLERS ()는 각 프로세서를 레이어별로 나열합니다. 일반적인 프로세서에는 GZIP 핸들러 , MB_OUTPUT_HANDLER 등이 포함됩니다.
해당 시나리오 :
캐시 메커니즘을 디버그하십시오.
특정 캐시 프로세서가 있는지 확인하십시오.
복잡한 프로그램에서 버퍼의 오해를 피하십시오.
특정 캐시 프로세서를 끄는 등 출력 동작을 동적으로 조정합니다.
예제 응용 프로그램 : 시스템에 GZIP 출력 압축이 활성화되어 있다고 가정하면 다음 코드로 감지 할 수 있습니다.
if (in_array('gzip handler', ob_list_handlers())) {
echo "현재 활성화되었습니다 Gzip 출력 압축!";
}
https://www.gitbox.net/api/stream 과 같은 출력 스트림 API를 디버깅하고 개발하는 경우이 감지는 우발적 인 출력이 데이터 전송을 방해하는 것을 방지하는 데 특히 유용합니다.
OB_END_CLEAN () 은 현재 상단 상단 출력 버퍼를 종료 하고 버퍼의 내용을 지우는 작동 함수입니다. 이 기능이 호출되면 버퍼의 내용은 브라우저 또는 클라이언트로 전송되지 않습니다.
문법:
ob_end_clean();
참고 :
활성 출력 버퍼가없는 경우 OB_END_CLEAN ()을 호출하면 경고가 트리거됩니다.
상단에서 가장 큰 출력 버퍼 만 지우고 멀티 레이어 버퍼링이 주기적으로 Clear를 호출 해야하는 경우에만 제거됩니다.
해당 시나리오 :
파일 다운로드를 생성 할 때 우발적 인 출력 간섭 방지 (예 : CSV, Zip);
시스템 정보 유출을 피하십시오 (예 : 오류, 디버깅 정보);
응답 출력 컨텐츠를 동적으로 제어하고 쓸모없는 캐시를 미리 지우십시오.
샘플 응용 프로그램 :
// 출력 캐시를 시작하십시오
ob_start();
echo "출력해서는 안되는 일부 디버깅 정보...";
// 캐시를 지우고 닫습니다
ob_end_clean();
// 올바른 데이터를 보내십시오
header('Content-Type: application/json');
echo json_encode(['status' => 'success']);
https://www.gitbox.net/export/csv 와 유사한 인터페이스를 개발하는 경우 불필요한 컨텐츠 출력이 없는지 확인하는 것이 매우 중요합니다. OB_END_CLEAN ()은 다운로드 된 파일 컨텐츠가 순수하고 오류가 없는지 확인할 수 있습니다.
프로젝트 | OB_LIST_HANDLERS () | ob_end_clean () |
---|---|---|
기능 | 현재 출력 버퍼 프로세서 목록을 쿼리하십시오 | 현재 출력 버퍼를 끝내고 지우십시오 |
버퍼 컨텐츠를 수정할지 여부 | 아니요 | 예 (CLEAR CONTS) |
일반적인 사용 시나리오 | 버퍼 레벨 디버깅 및 점검 | 파일 다운로드, 명확한 오류 출력 |
경고가 전송됩니다 | 아니요 | 예 (버퍼가없는 경우) |
OB_LIST_HANDLERS ()를 사용하십시오.
캐시 상태를 이해해야 할 때;
캐시 된 컨텐츠가 안전한지 동적으로 결정 해야하는 경우;
복잡한 캐시 스택 처리 (예 : 중첩 캐시, GZIP 압축 등);
OB_END_CLEAN () : 사용하십시오.
출력이 순수한 지 확인하려면 모든 관련이없는 출력을 지워야합니다 .
API 인터페이스 및 파일 다운로드 기능을 개발할 때;
프로그램 예외 처리 프로세스 중에 디버깅 정보의 누출을 방지하십시오.
일반적인 관행은 먼저 키 출력 지점에서 OB_List_Handlers ()를 통해 버퍼 상태를 확인한 다음 OB_END_CLEAN ()을 사용하여 상황에 따라 출력을 정리하는 것입니다.
예 : 동시에 두 가지를 모두 사용하기위한 팁
// 알 수없는 버퍼 간섭이 없는지 확인하십시오
while (ob_get_level() > 0) {
ob_end_clean();
}
// 공식 출력을 시작하십시오
header('Content-Type: application/json');
echo json_encode(['status' => 'clean_output']);
이 처리를 통해 시스템에 GZIP 버퍼와 템플릿 버퍼가 있더라도 출력 컨텐츠가 깨끗하고 신뢰할 수 있는지 확인할 수 있습니다. 예를 들어, 응답 내용을 엄격하게 제어 해야하는 https://www.gitbox.net/api/clean-output 과 같은 인터페이스에서 특히 중요합니다.
OB_LIST_HANDLERS () 및 OB_END_CLEAN () 각각의 책임은 다른 책임입니다. 하나는 스카우트이고 다른 하나는 더 깨끗합니다. 합리적으로 사용하면 프로그램의 견고성을 향상시킬뿐만 아니라 캐시 출력으로 인한 문제를 크게 줄이고 응용 프로그램 안정성 및 사용자 경험을 향상시킬 수 있습니다.