PHP 프로그래밍에서 OB_CLEAN () 은 일반적인 출력 버퍼 관리 기능입니다. 그 목적은 현재 출력 버퍼를 지우지 만 버퍼 컨텐츠를 출력하지 않는 것입니다. 많은 개발자들이 OB_CLEAN ()를 사용할 때 캐시 실업 문제를 겪습니다. 이 현상은 개발자를 혼동 할 수 있습니다.이 기능이 호출 된 후에도 버퍼 컨텐츠가 여전히 존재하는 이유는 무엇입니까?
이 기사에서는 OB_CLEAN ()가 어떻게 작동하는지, 캐시 실업을 유발할 수있는 일반적인 오해를 분석하고 실용적인 솔루션을 제공 할 것입니다.
PHP에서 출력 버퍼링 메커니즘은 출력 데이터 (예 : HTML, 텍스트 또는 오류 메시지)를 브라우저로 직접 전송하는 대신 메모리 버퍼에 임시로 저장할 수 있습니다. 이 메커니즘의 장점은 스크립트 실행 중 출력을 수정하거나 특정 조건에서 출력이 브라우저로 전송 될 때 제어 할 수 있다는 것입니다.
OB_CLEAN () 함수는 전류 버퍼의 내용을 지우는 데 사용됩니다. 이 함수가 호출되면 버퍼의 내용은 폐기되지만 데이터는 출력되지 않습니다.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 출력 버퍼링을 시작하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 버퍼를 지 웁니다</span></span><span>
</span><span><span class="hljs-comment">// 여기에 출력이 없습니다,버퍼가 지워지기 때문입니다</span></span><span>
</span></span>
OB_CLEAN ()은 현재 활성 출력 버퍼 만 제거 할 것입니다. 활성 버퍼가 없거나 통화가 호출 될 때 버퍼가없는 경우 효과가 없습니다.
OB_CLEAN ()은 문서에 명확하게 정의되지만 실제로 사용하면 개발자는 종종 다음 오해를 만나서 캐시가 지워지지 않았다고 믿게됩니다.
OB_START ()가 출력 버퍼링 메커니즘을 시작하기 위해 먼저 호출되지 않은 경우 OB_CLEAN () 호출은 아무런 영향을 미치지 않습니다. PHP에서 OB_CLEAN ()은 출력 버퍼가 시작된 후에 만 버퍼를 지울 수 있습니다.
<span><span><span class="hljs-comment">// 오류 데모:未출력 버퍼링을 시작하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 여기에는 효과가 없습니다,버퍼가 없기 때문입니다</span></span><span>
</span></span>
올바른 방법은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 버퍼를 시작하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 这里才会버퍼를 지 웁니다</span></span><span>
</span></span>
PHP는 중첩 출력 버퍼링을 지원합니다. OB_CLEAN () 이 호출 될 때 올바른 버퍼 중첩 구조가 처리되지 않으면 정리 된 버퍼 대신 잘못된 버퍼를 지울 수 있습니다. PHP의 출력 버퍼는 스택 기반이므로 OB_END_CLEAN ()을 사용하여 최상위 버퍼를 끝내고 지우십시오.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 버퍼를 시작하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"First output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 再次버퍼를 시작하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Second output"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 두 번째 버퍼 만 지워집니다,첫 번째를 지우지 않을 것입니다</span></span><span>
</span><span><span class="hljs-comment">// 전화해야합니다 ob_end_clean() 가장 바깥 쪽 버퍼를 제거합니다</span></span><span>
</span></span>
출력 버퍼가 브라우저로 전송 된 경우 OB_CLEAN ()은 전송 된 컨텐츠를 지울 수 없습니다. PHP는 준비가되었고 출력이 트리거되면 버퍼 컨텐츠를 브라우저에 자동으로 전송합니다. 일반적으로 Flush ()가 호출되거나 스크립트가 자동으로 종료 될 때 발생합니다.
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// 브라우저에 대한 출력 버퍼 컨텐츠</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 이때 전화했습니다 ob_clean() 유효하지 않은,내용이 전송 되었기 때문에</span></span><span>
</span></span>
솔루션은 버퍼 내용을 너무 일찍 출력하지 않거나 출력이 출력 된 경우 지우지 않고 OB_END_CLEAN () 으로 출력 버퍼를 직접 종료하지 않는 것입니다.
OB_START () 에서 버퍼 컨텐츠를 처리하기 위해 콜백 함수를 제공하는 경우 OB_CLEAN () 에서 지우는 것은 콜백에서 처리 한 컨텐츠입니다. 콜백 함수 내에 오류 나 논리적 문제가있는 경우 버퍼가 지워지지 않았다고 생각할 수 있습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_callback</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$buffer</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$buffer</span></span><span>); </span><span><span class="hljs-comment">// 버퍼 컨텐츠를 대문자로 변환하십시오</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(</span><span><span class="hljs-string">"custom_callback"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>(); </span><span><span class="hljs-comment">// 버퍼를 지 웁니다,그러나 콜백 함수로 인해,내용이 수정되었을 수 있습니다</span></span><span>
</span></span>
PHP에는 출력 버퍼링과 관련이없는 PHP (예 : Opcache, 데이터베이스 쿼리 캐시 등)에 다른 많은 유형의 캐싱 메커니즘이 있습니다. 따라서 OB_CLEAN ()은 다른 유형의 캐시에 영향을 미치지 않으면 서 PHP의 출력 버퍼 만 제거합니다.
위의 오해를 피하려면 개발자는 다음과 같은 모범 사례를 따라야합니다.
출력 버퍼가 올바르게 시작되었는지 확인하십시오 . OB_CLEAN ()을 호출하기 전에 출력 버퍼를 먼저 시작 하십시오.
버퍼 스택 구조 이해 : 중첩 버퍼를 사용하는 경우 가장 올바른 버퍼를 지우거나 OB_END_CLEAN ()을 사용하여 최상위 버퍼를 지우십시오.
사전에 콘텐츠를 출력하지 마십시오 . OB_CLEAN () 또는 OB_END_CLEAN ()을 호출하기 전에 버퍼의 내용을 출력하지 마십시오. Flush () 를 호출하지 마십시오.
콜백 기능 확인 : 사용자 정의 출력 버퍼 처리 기능을 사용하는 경우 로직이 올바른지 확인하고 OB_CLEAN () 의 효과를 방해하지 않도록하십시오.
이러한 세부 사항을 이해함으로써 PHP 출력 버퍼링을보다 효과적으로 관리하고 캐시 빈 및 무효화를 피할 수 있습니다.