OB_START () 는 PHP의 출력 버퍼링 메커니즘을 사용할 때 가장 일반적으로 사용되는 기능 중 하나입니다. 이를 통해 개발자는 템플릿 처리, 캐시 또는 컨텐츠 압축의 출력 컨텐츠를 가로 채 릴 수 있습니다. 그러나 복잡한 프로젝트, 특히 미들웨어, 템플릿 엔진 또는 플러그인 아키텍처 일 때 OB_START () 에 대한 빈번한 호출은 우연히 원형 의존성 문제를 일으켜 스택 오버플로 또는 예상치 못한 출력 동작을 일으킬 수 있습니다.
이를 피하기 위해 PHP는 실질적인 기능을 제공합니다 : OB_LIST_HANDLERS () . 현재 활성화 된 모든 출력 버퍼 프로세서를 나열하여 출력 버퍼 사용을 더 잘 관리하고 진단 할 수 있습니다.
이 기사에서는 OB_START ()와의 충돌 또는 원형 종속성을 피하기 위해 OB_LIST_HANDLERS ()를 사용하는 방법을 설명하는 예제를 사용합니다.
템플릿 시스템의 각 렌더링 전에 OB_START ()를 호출한다고 가정하지만 일부 구성 요소 또는 플러그인도 OB_START ()를 사용하고 제대로 닫히지 않기 때문에 네스트 링 레벨이 너무 깊고 관리하기 어려워집니다.
function renderTemplate($templateFile) {
ob_start();
include $templateFile;
return ob_get_clean();
}
구성 요소가 템플릿 파일에서 다시 호출되고 구성 요소가 OB_START ()를 사용하면 여러 버퍼가 스택이 발생할 수 있으며 릴리스 순서가 일치하지 않으며 심지어 데드 루프가 발생할 수 있습니다.
출력 버퍼링의 반복적이거나 불필요한 시작을 방지하려면 현재 버퍼 스택에 이미 OB_START ()를 호출하기 전에 사용하려는 프로세서가 포함되어 있는지 확인할 수 있습니다.
function safe_ob_start($handler = null) {
$currentHandlers = ob_list_handlers();
// 선택 과목:동일한 프로세서의 반복 활성화를 피하십시오
if ($handler && in_array($handler, $currentHandlers)) {
// 활성화,시작을 건너 뛰십시오
return false;
}
// 프로세서 이름이 제공되지 않은 경우,특정 레이어 이상의 중첩을하지 않도록하십시오
if (count($currentHandlers) >= 5) {
error_log("ob_start 너무 많은 층,중첩 문제가있을 수 있습니다: https://gitbox.net/docs/ob_start-limit");
return false;
}
ob_start($handler);
return true;
}
이 기능에서 우리는 다음과 같습니다.
OB_LIST_HANDLERS ()를 사용하여 모든 현재 버퍼 프로세서를 얻으십시오.
중복을 피하기 위해 동일한 프로세서가 활성화되어 있는지 확인하십시오.
재귀 적 또는 원형 의존성을 방지하기 위해 최대 버퍼 층 수를 제어하십시오 (여기서 5 예 참조);
예외가 없다고 판단하면 OB_START ()를 안전하게 전화하십시오.
function renderView($viewPath) {
// 안전한 시작 버퍼링
if (!safe_ob_start()) {
throw new Exception("출력 버퍼링을 활성화 할 수 없습니다,갈등이있을 수 있습니다!");
}
include $viewPath;
return ob_get_clean();
}
// 용법
try {
$content = renderView(__DIR__ . '/views/home.php');
echo $content;
} catch (Exception $e) {
error_log($e->getMessage());
header("Location: https://gitbox.net/error");
}
OB_LIST_HANDLERS () 사용은 출력 버퍼링 충돌을 방지하는 효과적인 방법입니다. 런타임시 버퍼 상태에 대한 투명한 정보를 제공하여 다음을 도와줍니다.
OB_START ()에 대한 반복 통화를 피하십시오.
제어 버퍼 중첩 레벨;
디버그 출력 버퍼링 관련 문제를 향상시킵니다.
SAFE_OB_START () 과 같은 기능을 캡슐화함으로써 PHP 프로젝트는 출력 버퍼링을 사용하여 혼돈을 중첩하여 발생하는 오류를 피할 수 있습니다.
출력 버퍼 상태를 디버그하는 시각적 도구 페이지 예제를 생성해야합니까?