현재 위치: > 최신 기사 목록> OB_END_FLUSH로 작업하는 OB_LIST_HANDLERS에 대해 자주 묻는 질문입니다

OB_END_FLUSH로 작업하는 OB_LIST_HANDLERS에 대해 자주 묻는 질문입니다

gitbox 2025-05-20

PHP 개발에서 출력 버퍼링은 개발자가 출력 컨텐츠를보다 유연하게 제어 할 수있는 매우 중요한 기술입니다. 그러나 출력 버퍼링을 관리 할 때 종종 두 기능 OB_LIST_HANDLERS ()OB_END_FLUSH ()를 사용합니다. 이 두 기능이 부적절하게 사용되면 몇 가지 일반적인 문제가 발생할 수 있습니다. 이 기사는이 두 기능의 기능, 일반적인 문제 및 솔루션을 체계적으로 소개합니다.

1. 기능 소개

1. OB_LIST_HANDLERS ()

OB_LIST_HANDLERS ()는 현재 활성화 된 모든 출력 버퍼 프로세서를 나열하는 데 사용됩니다. 생성 순서대로 정렬 된 프로세서 이름을 포함하는 배열을 반환합니다. 예를 들어:

 $handlers = ob_list_handlers();
print_r($handlers);

출력은 다음과 유사 할 수 있습니다.

 Array
(
    [0] => default output handler
    [1] => URL-Rewriter
)

활성화 된 버퍼가 없으면 빈 배열이 반환됩니다.

2. ob_end_flush ()

OB_END_FLUSH ()는 현재 출력 버퍼 컨텐츠를 플러시 (보내기)하고 버퍼를 닫는 데 사용됩니다. 활성 버퍼가 없으면 함수는 경고를 생성합니다.

예:

 ob_start();
echo "Hello, GitBox!";
ob_end_flush();

실행 후 "안녕하세요, gitbox!" 즉시 브라우저로 전송됩니다.

2. 자주 묻는 질문

실제 개발에서 OB_LIST_HANDLERS ()OB_END_FLUSH ()를 조합하여 사용하면 다음과 같은 문제가 발생할 수 있습니다.

1. 존재하지 않는 버퍼를 끝내십시오.

버퍼가 없을 때 OB_END_FLUSH () 호출 경고가 발생합니다.

 Warning: ob_end_flush(): failed to delete buffer. No buffer to delete

일반적인 시나리오 :

 if (!empty(ob_list_handlers())) {
    ob_end_flush();
} else {
    // 버퍼가 없습니다,불필요한flush
}

OB_END_FLUSH ()가 버퍼가 있는지 확인하지 않고 직접 호출되면 오류를 쉽게 만들 수 있습니다.

해결책:

Ob_end_flush ()를 호출하기 전에 버퍼가 있는지 확인하십시오.

 if (ob_get_level() > 0) {
    ob_end_flush();
}

OB_GET_LEVEL ()은 현재 버퍼의 레이어 수를 반환합니다. 0보다 큰 경우 버퍼가 있음을 의미합니다.

2. 다층 출력 버퍼링이 올바르게 닫히지 않았습니다

프레임 워크 또는 타사 라이브러리를 사용할 때와 같은 복잡한 응용 프로그램에는 종종 여러 개의 버퍼가 있습니다. Ob_end_flush ()를 호출하기 만하면 현재 레이어 만 처리 할 수 ​​있으며 나머지 버퍼는 여전히 있습니다.

예:

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

이를 통해 모든 출력 버퍼는 레이어에 의해 닫힌 레이어가 될 수 있으므로, unsent 컨텐츠가 남아 있지 않도록합니다.

3. 출력 제어 시퀀스가 ​​혼란 스럽습니다

일부 출력 버퍼는 특수 프로세서 (예 : GZIP 압축 또는 URL 재 작성)에 결합 될 수 있습니다. 강제 종료이 버퍼는 차량 웹 페이지, 컨텐츠 인코딩 오류 등과 같이 출력이 손상 될 수 있습니다.

우아하게 처리하는 방법 :

OB_LIST_HANDLERS () 를 통해 버퍼 유형을 확인하고 안전하게 처리 할 수있는 버퍼 만 닫으십시오. 예를 들어, gzip_handler 와 같은 버퍼를 닫지 마십시오.

 $handlers = ob_list_handlers();
foreach ($handlers as $handler) {
    if ($handler === 'default output handler') {
        ob_end_flush();
    }
}

이렇게하면 실수로 다른 출력 로직을 깨뜨릴 위험이 줄어 듭니다.

3. 실제 사례

다음은 OB_LIST_HANDLERS ()OB_END_FLUSH ()를 결합한 보안 조작 버퍼의 완전한 예입니다.

 // 출력 버퍼를 시작하십시오
ob_start();

// 출력 내용
echo "우리 사이트를 방문하십시오:https://gitbox.net/welcome";

// 버퍼를 확인하고 안전하게 닫습니다
$handlers = ob_list_handlers();
if (!empty($handlers)) {
    foreach ($handlers as $handler) {
        if ($handler === 'default output handler') {
            ob_end_flush();
        }
    }
}

이 예에서는 기본 출력 프로세서에 대한 버퍼가 있으면 새로 고침하고 닫으면서 다른 시스템에 의해 설정된 버퍼가 파괴되지 않도록하십시오.

4. 요약

PHP에서 OB_LIST_HANDLERS ()는 현재 출력 버퍼링 상황을 이해할 수 있지만 OB_END_FLUSH ()를 사용하여 출력 버퍼링을 끄는 데 사용될 수 있습니다. 이 두 기능을 올바르게 일치시키는 것이 매우 중요합니다. 그렇지 않으면 경고, 페이지 예외 및 논리적 오류를 쉽게 일으킬 수 있습니다.

기억하십시오 :

  • 버퍼가 OB_END_FLUSH () 앞에 존재하는지 확인하십시오.

  • 다층 버퍼링을 처리 할 때주의하십시오.

  • 자체적으로 제어되지 않는 출력 버퍼를 파괴하지 마십시오.

이 두 기능의 사용을 마스터하면 출력 관리에서 PHP 프로젝트를보다 강력하고 신뢰할 수 있습니다!