현재 위치: > 최신 기사 목록> OB_LIST_HANDLERS를 사용할 때 여러 출력 캐시를 피하는 방법

OB_LIST_HANDLERS를 사용할 때 여러 출력 캐시를 피하는 방법

gitbox 2025-05-14

PHP의 출력 버퍼링 메커니즘을 사용할 때는 종종 OB_START ()OB_GET_CONTENTS () 와 같은 기능을 사용하여 컨텐츠의 출력을 제어합니다. 이 도구는 템플릿 엔진, 캐시 생성, 페이지 압축 및 기타 시나리오에서 매우 일반적입니다. 그러나 우연히 처리되면 캐시 된 컨텐츠가 여러 번 출력 될 수 있으므로 페이지의 정상 표시에 영향을 미칩니다.

실용적이지만 쉽게 간과되는 기능 중 하나는 OB_List_Handlers () 입니다. 현재 활성화 된 모든 버퍼 핸들러를 보는 데 도움이됩니다. 올바르게 사용하면 출력 버퍼가 반복적으로 출력되는 문제를 효과적으로 피할 수 있습니다.

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

PHP의 출력 버퍼를 사용하면 수동 플러시가 완료되거나 스크립트가 균일하게 출력 될 때까지 출력 컨텐츠를 메모리에 저장할 수 있습니다. 이것은 우리를 도울 수 있습니다 :

  • 컨텐츠를 출력하기 전에 HTTP 헤더 정보를 수정합니다.

  • 제어 캐시 된 컨텐츠;

  • 출력 컨텐츠를 압축하거나 필터링하십시오.

기본 사용 예제는 다음과 같습니다.

 ob_start();
echo "Hello, World!";
$content = ob_get_contents();
ob_end_clean();

이 코드에서 "안녕하세요, 세계!" 버퍼에 출력 한 다음 변수 $ 컨텐츠 로 추출되며 직접 출력을 피하기 위해 OB_END_CLEAN () 을 통해 버퍼가 지워집니다.

2. OB_LIST_HANDLERS () 의 역할

OB_LIST_HANDLERS ()는 모든 현재 출력 버퍼 프로세서 이름을 반환합니다. 이는 중복 출력 문제를 해결하는 강력한 도구입니다.

예를 들어:

 ob_start();
ob_start('ob_gzhandler');

print_r(ob_list_handlers());

출력은 다음과 같습니다.

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

각 프로세서는 스택 방식으로 버퍼링 된 출력을 처리합니다. 이전 버퍼를 청소하지 않으면 내용이 반복적으로 압축되거나 출력 될 수 있습니다.

3. 캐시 출력을 여러 번 피하는 방법은 무엇입니까?

복잡한 프로젝트에서는 여러 구성 요소를 사용하는 경향이 있으며, 모두 자체 출력 버퍼링을 켜질 수 있습니다. 버퍼 레벨이 통일되지 않으면 다음과 같은 문제가 쉽게 발생합니다.

  • 캐시 컨텐츠 출력 여러 번;

  • 출력 순서는 일관성이 없습니다.

  • 버퍼링이 올바르게 닫히지 않으면 메모리 누출이 발생합니다.

해결책 1 : 버퍼링이 켜졌는지 여부를 결정하십시오

OB_GET_LEVEL ()을 사용하여 현재 버퍼 레벨을 감지하고 반복적 인 통화를 피하십시오.

 if (ob_get_level() === 0) {
    ob_start();
}

솔루션 2 : OB_LIST_HANDLERS ()를 사용하여 중복 제거 판단을 내립니다

특정 프로세서가 활성화되었는지 여부를 감지하기 위해 도우미 기능을 작성할 수 있습니다.

 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에 의해 출력이 여러 번 압축되는 것을 피합니다.

솔루션 3 : 모든 버퍼의 통합 종료

어떤 버퍼가 켜져 있는지 확실하지 않은 경우 다음 방법을 사용하여 지우실 수 있습니다.

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

이것은 종종 중첩 버퍼 레벨이 문제를 일으키지 않도록 프레임 워크 또는 핵심 컨트롤러에 사용됩니다.

4. 실제 사례 : 캐시 HTML 페이지 컨텐츠

 $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 출력을 처리 할 때.

충돌의 위험을 줄이고 콘텐츠 출력을보다 제어 가능하고 효율적으로 만들기 위해 대규모 프로젝트 또는 다중 모전 시스템의 출력 버퍼링 로직을 통합하는 것이 좋습니다.

참조로 완전한 버퍼 관리 클래스 캡슐화를 제공해야합니까?