PHP 개발에서 스크립트를 통해 파일 다운로드 기능을 제공 해야하는 경우 종종 버퍼 관련 문제가 발생합니다. 특히 파일 컨텐츠를 출력하기 전에 예기치 않은 공백 문자 또는 출력 컨텐츠가 나타날 수 있습니다. 현재 OB_END_CLEAN 기능을 사용하여 출력 버퍼를 청소하여 파일을 사용자에게 올바르게 전송할 수 있도록해야합니다.
출력 버퍼링은 PHP가 스크립트를 실행할 때 모든 출력 컨텐츠 (예 : HTML 코드, 텍스트, 이미지 등)가 브라우저로 즉시 전송되지 않지만 임시 영역 (예 : 버퍼)에 저장됩니다. PHP는 스크립트가 실행되거나 특정 출력 기능이 호출 될 때까지 버퍼의 내용을 브라우저로 보내지 않습니다.
이 메커니즘은 출력을 효과적으로 제어하고 스크립트 실행 중에 너무 많은 불필요한 데이터를 보내지 않고 불필요한 네트워크 부담을 줄이며 성능을 향상시킬 수 있습니다.
경우에 따라 특히 파일 다운로드 기능을 제공 할 때 PHP 스크립트는 파일 컨텐츠를 보내기 전에 추가 컨텐츠 또는 공백 문자를 출력하여 브라우저에서 구문 분석하여 파일 다운로드 프로세스에 영향을 미칩니다. 이를 피하기 위해 개발자는 파일 내용을 출력하기 전에 버퍼를 청소해야하며 불필요한 출력 데이터가 없도록해야합니다.
예를 들어, 데이터베이스에서 파일의 내용을 읽고 다운로드를 제공하는 PHP 스크립트가 있다고 가정합니다. 스크립트가 현재 관련없는 콘텐츠를 출력하면 브라우저는 먼저 컨텐츠를 수신 한 다음 파일 내용을 수신하여 파일을 올바르게 다운로드하지 않거나 다운로드가 손상된 파일이 손상 될 수 있습니다.
현재 OB_END_CLEAN 함수는 유용 할 수 있습니다. 전류 버퍼의 내용을 청소하고 버퍼의 출력 스트림을 닫으므로 중복 데이터의 출력이 방지됩니다.
출력 버퍼 활성화 :
PHP에서는 출력 버퍼가 일반적으로 자동으로 켜지지 만 OB_START ()를 명시 적으로 호출하여 출력 버퍼를 켤 수 있습니다. 파일 다운로드 스크립트에서는 매우 중요합니다. 브라우저에 출력 할시기를 결정하기 전에 모든 출력을 캐시 할 수 있기 때문입니다.
<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><span><span class="hljs-comment">// 파일 처리 로직 시뮬레이션</span></span><span>
</span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'path/to/your/file.txt'</span></span><span>; </span><span><span class="hljs-comment">// 파일 경로</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>)) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'File not found'</span></span><span>);
}
</span><span><span class="hljs-comment">// 다운로드 헤더 정보를 설정하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/octet-stream'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Disposition: attachment; filename="'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>) . </span><span><span class="hljs-string">'"'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>));
</span></span>버퍼 청소 :
파일을 보내기 전에 OB_END_CLEAN ()을 호출하여 버퍼를 지우려면 이전의 모든 출력 컨텐츠가 정리되었는지 확인하십시오. 현재 PHP는 데이터를 브라우저에 보내지 않아 가능한 간섭을 피합니다.
<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>출력 파일 컨텐츠 :
다음으로 파일 내용을 안전하게 출력 할 수 있습니다. 예를 들어, readfile () 함수를 사용하여 파일의 내용을 브라우저에 출력하고 파일 다운로드를 시작하십시오.
<span><span><span class="hljs-title function_ invoke__">readfile</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>); </span><span><span class="hljs-comment">// 출력 파일 컨텐츠</span></span><span>
</span><span><span class="hljs-keyword">exit</span></span><span>; </span><span><span class="hljs-comment">// 엔드 스크립트 실행,다른 컨텐츠가 출력되지 않도록하십시오</span></span><span>
</span></span> <span><span><span class="hljs-meta"><?php</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-comment">// 파일 경로</span></span><span>
</span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'path/to/your/file.txt'</span></span><span>; </span><span><span class="hljs-comment">// 请替换为实际파일 경로</span></span><span>
</span><span><span class="hljs-comment">// 파일이 있는지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>)) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'File not found'</span></span><span>);
}
</span><span><span class="hljs-comment">// 다운로드 헤더 정보를 설정하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/octet-stream'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Disposition: attachment; filename="'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>) . </span><span><span class="hljs-string">'"'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-variable">$file_path</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-title function_ invoke__">readfile</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>);
</span><span><span class="hljs-comment">// 엔드 스크립트 실행</span></span><span>
</span><span><span class="hljs-keyword">exit</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>파일이 다운로드되기 전에 OB_end_clean () 함수를 사용하여 출력 버퍼를 정리하면 PHP 스크립트에서 관련없는 콘텐츠 출력을 피하고 파일을 사용자에게 원활하게 전송할 수 있는지 확인할 수 있습니다. 이 방법은 파일 다운로드를 처리 할 때 매우 효과적이며 예기치 않은 출력으로 인한 다운로드 문제를 방지 할 수 있습니다. 출력 버퍼와 OB_END_CLEAN () 함수의 합리적인 사용은 파일 다운로드 기능의 안정성과 사용자 경험을 향상시키는 중요한 수단입니다.