현재 위치: > 최신 기사 목록> OB_LIST_HANDLERS 및 OB_CLEAN : 정확한 캐시 청소를 구현하는 방법

OB_LIST_HANDLERS 및 OB_CLEAN : 정확한 캐시 청소를 구현하는 방법

gitbox 2025-05-28

PHP에서 출력 버퍼링은 스크립트의 출력 동작을 제어 할 수있는 강력한 기능입니다. 출력 버퍼링은 특히 출력 컨텐츠를 동적으로 수정, 압축, 캐시링 또는 일시적으로 억제 할 때 특히 중요합니다. OB_LIST_HANDLERS ()OB_CLEAN () 은 버퍼 관리에서 매우 실용적인 기능입니다.

이 기사는 OB_LIST_HANDLERS () 의 역할을 설명하고 OB_CLEAN ()을 결합하여 정확한 제어를 달성하고 버퍼 컨텐츠를 정리하는 방법을 보여줍니다.

1. 출력 버퍼링 메커니즘 소개

기본적으로 PHP 스크립트가 실행될 때의 출력은 브라우저로 직접 전송됩니다. 그러나 출력 버퍼링 (예 : OB_START () )을 켜면 PHP는 메모리의 출력 컨텐츠를 일시적으로 저장하므로 전송 전에 추가 처리를 수행 할 수 있습니다.

일반적으로 사용되는 버퍼링 기능에는 다음이 포함됩니다.

  • OB_START () : 새 출력 버퍼를 엽니 다

  • OB_GET_CONTENTS () : 버퍼에서 내용을 가져옵니다

  • OB_END_CLEAN () : 버퍼를 지우고 버퍼를 닫습니다

  • OB_CLEAN () : 버퍼를 지우지 만 버퍼를 닫지 마십시오.

  • OB_LIST_HANDLERS () : 현재 열린 버퍼 프로세서를 나열합니다

2. OB_LIST_HANDLERS () 함수에 대한 자세한 설명

OB_LIST_HANDLERS ()는 현재 열린 출력 버퍼와 해당 프로세서 이름을 포함하는 배열을 반환하는 데 사용됩니다. 이 기능은 특히 복잡한 버퍼 제어 시나리오에서 현재 버퍼 스택의 상태를 디버깅하거나 판단하는 데 사용됩니다.

예:

 ob_start('ob_gzhandler'); // 사용gzip압축
ob_start();               // 기본 버퍼링을 켭니다

print_r(ob_list_handlers());

출력은 다음과 같습니다.

 Array
(
    [0] => default output handler
    [1] => ob_gzhandler
)

이 배열의 순서는 "첫 번째 및 아웃"(Lifo)이므로 상단 버퍼가 배열 앞에 있음을 의미합니다.

3. OB_CLEAN () 의 역할과 오용의 위험

OB_CLEAN ()은 현재 상단 버퍼의 내용을 지우지 만 버퍼를 닫지 않습니다. 이는 HTTP 헤더 정보를 보내기 전에 출력이 없도록하는 데 중요합니다.

예를 들어:

 ob_start();
echo "임시 출력";
ob_clean(); // 버퍼를 지 웁니다“임시 출력”

오용 위험 :

멀티 버퍼 시나리오에서 OB_CLEAN ()을 맹목적으로 호출하면 압축/인코딩 프로세서의 버퍼를 지우지 말아야 할 컨텐츠를 지우거나 예상치 못한 출력 동작이 발생할 수 있습니다.

4. OB_LIST_HANDLERS ()OB_CLEAN ()을 사용하여 정확한 제어를 달성하십시오

복잡한 버퍼링 시나리오에서 여러 프로세서 (GZIP 압축, 사용자 정의 콜백 등)를 활성화하는 경우 버퍼를 청소할 때 압축 프로세서 또는 기타 특정 레이어가 영향을받지 않도록 해야합니다. 현재 OB_LIST_HANDLERS ()를 사용하여 현재 버퍼 스택 구조를 결정하고 OB_CLEAN () 또는 OB_END_CLEAN ()을 호출할지 여부를 결정해야합니다.

샘플 시나리오 : 기본 버퍼 만 지우고 GZIP 압축 계층에 영향을 미치지 않습니다.

 ob_start('ob_gzhandler'); // 압축处理器
ob_start();               // 기본 버퍼 레이어

echo "출력 내용을 준비하십시오";

// 현재 버퍼 스택을 가져옵니다
$handlers = ob_list_handlers();

// 최상층이 기본 버퍼 인 경우,명확한 콘텐츠
if (!empty($handlers) && $handlers[0] === 'default output handler') {
    ob_clean();
}

// 출력 내용
echo "출력을 정리하십시오";

// 버퍼링을 차례로 끕니다
while (ob_get_level() > 0) {
    ob_end_flush();
}

5. 실제 응용 시나리오 : 캐시 오염 방지 또는 조기 출력 방지

사용자가 로그인하지 않을 때 실행을 중단하고 JSON 오류 응답을 반환하는 API 인터페이스를 개발한다고 가정합니다. 그러나 일부 모듈에는 실수로 출력이 발전했을 수 있습니다. 현재 OB_CLEAN ()OB_LIST_HANDLERS ()를 결합하여 버퍼를 청소할 수 있습니다.

 ob_start(); // 버퍼링을 켭니다

// 某些模块可能提前출력 내용
include 'some_module.php'; // 이 모듈에는 포함 할 수 있습니다 echo 성명

// 관련없는 출력을 정리하십시오
if (in_array('default output handler', ob_list_handlers())) {
    ob_clean();
}

// 표준으로 돌아갑니다JSON응답
header('Content-Type: application/json');
echo json_encode([
    'status' => 'error',
    'message' => '먼저 시스템에 로그인하십시오。'
]);

ob_end_flush(); // 출력을 보내십시오

이 움직임은 JSON을 보내기 전에 구조가 손상되는 것을 방지하여 클라이언트가 정상적으로 해결하지 못하게합니다.

6. 요약

OB_LIST_HANDLERS ()는 출력 버퍼 상태를 관찰하고 디버깅하는 강력한 도구입니다. OB_CLEAN () 과 함께 사용하면 복잡한 버퍼 스택에서 잘못된 내용을 피하고 출력 제어의 정확도와 안정성을 향상시킬 수 있습니다.

압축 출력, 중첩 버퍼링 및 모듈 식 출력과 관련 하여이 두 기능을 합리적으로 사용하면보다 안정적이고 제어 가능한 출력 전략을 구축하는 데 도움이됩니다. 컨텐츠 출력과 관련된 API 시스템이 있거나 SEO 친화적 인 정적 캐싱 기능이 필요한 경우 이러한 유형의 버퍼 제어 전략을 도입하는 것이 좋습니다.