PHP 개발에서 OB_CLEAN () 함수는 출력 버퍼 컨텐츠를 지우는 데 사용되며, 이는 디버깅 및 성능 최적화에서 매우 일반적입니다. 그러나 경우에 따라 다음 오류 메시지가 발생합니다.
<span><span><span class="hljs-built_in">Warning</span></span><span>: Cannot modify </span><span><span class="hljs-keyword">header</span></span><span> information - headers already sent </span><span><span class="hljs-keyword">by</span></span><span> (output started at /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/script.php:xx) </span><span><span class="hljs-keyword">in</span></span><span> /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/script.php </span><span><span class="hljs-keyword">on</span></span><span> </span><span><span class="hljs-type">line</span></span><span> xx
</span></span>
이 오류 프롬프트는 OB_CLEAN ()을 호출하여 버퍼를 지우더라도 HTTP 헤더 정보를 수정할 수는 없습니다. PHP가 출력 (HTML, 공백 또는 오류 메시지 등)을 보낼 때 HTTP 헤더 정보도 자동으로 전송되기 때문입니다. 출력 컨텐츠 전에 HTTP 헤더 정보를 전송해야하므로 출력이 시작된 경우 PHP는 새 헤더 정보를 수정하거나 보낼 수 없습니다.
HTTP 헤더 정보는 HTTP 요청 및 응답으로 전달되는 메타 데이터가 중요합니다. 예를 들어, 쿠키 설정, 다른 페이지로 점프하거나 캐시 제어 설정 등은 모두 HTTP 헤더 정보를 통해 달성됩니다.
PHP는 HTTP 헤더 정보를 수정하거나 추가하기 위해 헤더 () 함수를 제공합니다. 그러나이 기능에 대한 호출은 출력 내용 전에 실행해야합니다. 그렇지 않으면 위의 "헤더 전송"오류가 발생합니다.
OB_CLEAN () 함수는 PHP 출력 버퍼링 기능의 일부이며 출력 버퍼의 내용을 지우는 데 사용됩니다. 일반적 으로이 접근법은 많은 양의 출력 데이터를 처리 할 때 출력을 미리 전송하고 후속 헤더 설정에 영향을 줄 수 있습니다.
그러나 OB_CLEAN ()을 호출 한 후 브라우저로 전송 된 컨텐츠에는 영향을 미치지 않습니다. OB_CLEAN ()을 호출하기 전에 출력이 전송 된 경우 헤더 정보를 수정할 수 없습니다.
일반적으로 "HTTP 헤더가 보낸"오류에 대한 몇 가지 이유가 있습니다.
PHP는 스크립트가 시작되기 전에 또는 스크립트가 시작되기 전에 컨텐츠 (예 : HTML 태그, 공백, 오류 메시지 등)를 출력합니다.
에코 또는 인쇄 기능을 사용하여 컨텐츠를 미리 출력했습니다.
PHP 스크립트 전후에 여분의 공백 또는 라인 브레이크가 있습니다.
HTML 출력이든 모든 유형의 텍스트 출력에 관계없이 PHP가 HTTP 헤더를 자동으로 전송하게하므로 출력 후에 헤더 수정을 할 수 없습니다.
Header () 함수를 호출하기 전에 출력이 없는지 확인하려면 PHP 스크립트를 확인하십시오. 출력에는 다음이 포함될 수 있습니다.
HTML 태그
에코 또는 인쇄 기능의 내용
처리되지 않은 오류 메시지
스크립트가 시작되기 전에 공백 문자 또는 줄이 끊어집니다 (예 : 파일 시작 전후의 공백 또는 닫힌 태그)
출력 버퍼링 문제를 피하려면 스크립트 시작시 OB_START ()에게 호출 할 수 있습니다. 이렇게하면 PHP가 모든 출력 컨텐츠를 완충하고 스크립트 끝에서 한 번에 출력을 보낼 수있게되며 HTTP 헤더가 보낸 오류를 피하십시오.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: https://www.example.com'</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-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 출력 버퍼의 내용</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
OB_CLEAN () 과 유사하게 OB_END_CLEAN ()은 현재 버퍼의 내용을 지우고 버퍼를 닫습니다. 버퍼의 컨텐츠가 클라이언트로 전송되는 것을 방지하여 후속 HTTP 헤더 설정에 영향을 미치지 않도록합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: text/html; charset=UTF-8'</span></span><span>);
</span><span><span class="hljs-comment">// 버퍼를 지우고 닫습니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>();
</span><span><span class="hljs-comment">// 스크립트를 계속 처리하십시오</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
오류가 지속되면 모든 출력 소스를 찾아서 문제를 찾을 수 있습니다. 헤더 () 함수를 호출하기 전에 스크립트에 예기치 않은 출력이 없는지 확인하십시오. 디버깅 모드, 로깅 및 기타 수단으로 문제 해결을 도울 수 있습니다.
OB_CLEAN ()은 출력 버퍼를 지울 때 "헤더 전송"오류를 방지하는 데 매우 효과적입니다. 그러나 이것은 브라우저로 전송되지 않은 컨텐츠에만 작동합니다. PHP가 Header ()을 호출하기 전에 출력을 보냈다면 오류가 계속 발생합니다. 스크립트 시작시 OB_START ()를 호출하여 출력 버퍼링을 가능하게하고 컨텐츠 출력이 미리 없도록하여 이러한 문제를 효과적으로 피할 수 있습니다.
PHP의 출력 버퍼링 메커니즘을 이해하고 올바르게 사용하면 HTTP 헤더 및 출력 컨텐츠를 더 잘 관리하여보다 강력하고 효율적인 PHP 프로그램을 작성하는 데 도움이됩니다.