현재 위치: > 최신 기사 목록> OB_LIST_HANDLERS에서 여러 핸들러 충돌을 피하는 방법

OB_LIST_HANDLERS에서 여러 핸들러 충돌을 피하는 방법

gitbox 2025-05-20

PHP에서 출력 버퍼링은 개발자가 실제로 브라우저에 출력하기 전에 메모리에 컨텐츠를 저장할 수있는 강력한 메커니즘입니다. 이것은 출력을 수정, 압축 또는 필터링해야 할 때 특히 유용합니다. 그러나 출력 버퍼 핸들러 (예 : OB_START () 에 의해 등록 된 콜백)을 사용할 때 개발자는 종종 문제가 발생합니다. 다중 버퍼 핸들러 충돌이 발생하여 출력 예외 또는 논리적 혼란이 발생합니다.

이 기사는 OB_LIST_HANDLERS ()를 사용하여 현재 버퍼 스택에 어떤 핸들러가 있는지 확인하는 방법과 버퍼 핸들러 간의 충돌을 피하고 해결하는 방법을 자세히 설명합니다.

1. 출력 버퍼링의 기본 원리

PHP의 출력 버퍼는 OB_START () 를 통해 켜지고 출력이 일시적으로 저장됩니다. 버퍼가 닫히면 (예 : ob_end_flush () 와 같은 호출)는 등록 된 프로세서에 따라 컨텐츠가 처리되고 출력됩니다.

 ob_start(); // 프로세서가없는 버퍼를 켭니다
echo "Hello, world!";
$content = ob_get_clean(); // 버퍼링 된 컨텐츠를 가져 와서 버퍼링을 끕니다

처리 기능을 전달하여 버퍼 컨텐츠를 처리 할 수도 있습니다.

 function compress_output($buffer) {
    return gzencode($buffer);
}

ob_start("compress_output");
echo "This is the original content.";
ob_end_flush();

2. OB_LIST_HANDLERS의 역할

프로그램에서 OB_START ()가 여러 번 사용되면 현재 실행중인 프로세서가 어떤 프로세서를 실행 중인지 쉽게 알 수 있습니다. OB_LIST_HANDLERS ()는 모든 현재 버퍼 핸들러를 보는 데 사용되는 도구입니다.

 ob_start("strtoupper");
ob_start("urlencode");
print_r(ob_list_handlers());

출력은 비슷합니다.

 Array
(
    [0] => urlencode
    [1] => strtoupper
)

OB_LIST_HANDLERS () 의 리턴 결과는 "스택"순서대로 정렬되며 추가 된 버퍼 프로세서가 먼저 순위가 매겨집니다.

3. 일반적인 갈등 시나리오 및 솔루션

1. 동일한 프로세서의 등록을 반복하십시오

여러 모듈에 OB_START ( "OB_GZHANDLER")를 사용하는 등 여러 장소에서 동일한 프로세서를 재사용하면 압축이 여러 번 발생하고 콘텐츠 오류가 발생합니다.

해결책:

프로세서를 등록하기 전에 이미 존재하는지 확인하십시오.

 if (!in_array('ob_gzhandler', ob_list_handlers())) {
    ob_start('ob_gzhandler');
}

2. 독립 프로세서는 중간 층에 도입됩니다

일부 타사 프레임 워크 또는 라이브러리는 압축 또는 템플릿 렌더링과 같은 기본적으로 자체 출력 처리를 가능하게 할 수 있습니다. 수동으로 추가하는 프로세서는 호환되지 않을 수 있습니다.

샘플 질문 코드 :

 ob_start("custom_handler"); // 사용자 정의 프로세서
// 프레임 워크 내부에 동시에 추가되었습니다 ob_gzhandler

이로 인해 출력 또는 HTTP 헤더 충돌이 발생할 수 있습니다.

해결책:

출력 버퍼 시작 로직의 통합 관리, 항목 파일 또는 초기화 스크립트에 판단 추가 :

 function safe_ob_start($handler) {
    if (!in_array($handler, ob_list_handlers())) {
        ob_start($handler);
    }
}

3. 버퍼가 올바르게 청소되지 않아 비정상적인 출력이 발생합니다.

여러 프로세서가 등록 된 후 OB_END_FLUSH () 또는 OB_END_CLEAN ()을 올바른 순서로 호출하지 않으면 프로세서가 잘못 실행 될 수 있습니다.

모범 사례 : 통합 버퍼 스택 관리

 function clear_all_buffers() {
    while (ob_get_level() > 0) {
        ob_end_clean();
    }
}

모든 버퍼를 청소 해야하는 경우이 기능을 호출하여 깨끗한 출력 환경을 보장합니다.

4. 완전한 예 : 안전한 등록 출력 프로세서

 function register_output_handler($handler) {
    if (!in_array($handler, ob_list_handlers())) {
        ob_start($handler);
    } else {
        error_log("프로세서 $handler 등기,뛰어 올라。");
    }
}

// 내용을 압축하고 교체해야한다고 가정합니다.
function replace_and_compress($buffer) {
    $buffer = str_replace("example.com", "gitbox.net", $buffer);
    return gzencode($buffer);
}

// 注册프로세서
register_output_handler("replace_and_compress");

echo "방문에 오신 것을 환영합니다:https://example.com/page";

// 최종 출력 내용
ob_end_flush();

V. 결론

복잡한 PHP 응용 프로그램에서 여러 모듈 또는 라이브러리는 동시에 출력 버퍼 프로세서를 사용할 수 있으며 충돌은 부적절한 관리가 발생하기 쉽습니다. OB_LIST_HANDLERS ()를 사용하면 현재 등록 된 프로세서를 명확하게보고 새 프로세서를 등록 할 때 반복되는 등록 또는 혼란을 순서대로 피할 수 있습니다.

우수한 버퍼 스택 관리 및 프로세서 등록 전략을 통해 PHP 프로젝트의 안정성과 유지 가능성을 크게 향상시킬 수 있습니다.