php에서, ffflush () 함수는 출력 버퍼를 플러시하는 데 사용되며, 이는 버퍼의 내용이 즉시 대상 스트림에 기록되도록 강제합니다. 이 기능은 일반적으로 명령 줄 환경에서 실행할 때 예상대로 작동하지만 브라우저 환경에서는 예상대로 수행되지 않습니다. 그렇다면 왜 fflush ()를 사용하여 브라우저 환경에서 작동하지 않는 것 같습니다. 이 PHP 및 HTTP 프로토콜에는 몇 가지 특별한 이유가 있습니다.
우선, PHP 자체의 출력 버퍼링 메커니즘을 이해해야합니다. 명령 줄 (CLI) 환경에서 PHP는 코드를 단계별로 실행하고 즉시 결과를 표시합니다. 브라우저 환경에서 PHP는 일반적으로 스크립트가 실행되고 한 번에 브라우저로 전송 될 때까지 메모리의 모든 출력 컨텐츠를 캐시합니다. 다시 말해, 브라우저 환경에서 출력 컨텐츠는 즉시 클라이언트에게 전송되지 않고 스크립트가 실행되기를 기다리고 있습니다.
fflush () 함수를 호출하더라도 PHP는 버퍼를 새로 고치려고하지만 브라우저의 동작으로 인해 스크립트가 완료된 후에 만 데이터를 보내기 시작합니다. 브라우저의 데이터 수신은 HTTP 프로토콜을 기반으로하기 때문에 응답 헤더가 전송되기 전에 서버가 컨텐츠의 크기를 결정해야하므로 출력 버퍼의 새로 고침은 브라우저에서 즉시 인식되지 않습니다.
브라우저와 서버 간의 상호 작용은 HTTP 프로토콜을 따라 데이터 전송에 대한 기본 규칙을 규정합니다. HTTP 프로토콜은 요청을 서버로 전송하고 서버에서 처리하고 브라우저에 응답하는 요청-응답 모델을 기반으로 요청-응답 모델입니다. 응답 데이터 전송은 일반적으로 서버 스크립트가 처리를 마치고 모든 데이터가 준비된 후에 시작됩니다. 따라서 서버 측의 fflush () 함수를 사용하여 출력 버퍼가 새로 고침 되더라도 HTTP 응답 헤더가 전송되지 않으면 브라우저는 즉시이 컨텐츠를 수신하지 않습니다.
브라우저는 완전한 응답 헤더를 수신 한 후에 만 응답 본문의 내용을 처리하기 시작하기 때문에 HTTP 응답 헤더에 의해 브라우저로 데이터를 미리 전송하려는 시도는 제한됩니다. fflush () 를 통해 데이터가 버퍼로 플러시 된 경우에도 응답 헤더가 전송 및 처리 될 때까지 기다려야합니다.
브라우저는 일반적으로 전송이 끝나는 플래그가 될 때까지 서버가 전송하는 데이터를 캐시하고 배치합니다. PHP 출력 버퍼의 내용은 브라우저의 렌더링 프로세스에 직접 영향을 미치지 않습니다. fflush () 를 통해 버퍼를 새로 고치려고하더라도 브라우저는 서버가 응답을 종료하고 웹 페이지를 렌더링하기 전에 전체 데이터를 보낼 때까지 기다립니다. 이 동작은 일반적으로 브라우저 환경에서 fflush () 기능을 덜 분명하게 만듭니다.
브라우저 환경에서 즉시 콘텐츠를 보내야하는 경우 PHP의 OB_FLUSH () 함수를 사용할 수 있습니다. OB_FLUSH ()를 사용하여 PHP의 내부 출력 버퍼를 출력하고 지우는 데 사용될 수 있으며, 이는 컨텐츠를 즉시 브라우저로 전송합니다. fflush ( )가 파일 스트림에서 작동하고 ob_flush ()는 PHP 출력 버퍼를 목표로하기 때문에 fflush ()와 약간 다릅니다.
실시간 로깅 또는 장기 실행 스크립트 (예 : 데이터 처리 및 파일 다운로드 등)와 같은 실시간 출력이 필요한 시나리오에서는 OB_START ()를 사용하여 출력 버퍼를 활성화 한 다음 OB_FLUSH ()를 사용하여 컨텐츠를 실시간으로 전송할 수 있습니다. 이 방법을 사용하면 스크립트가 완전히 실행되기를 기다리지 않고 일부 컨텐츠가 가능한 빨리 브라우저에 전달되도록합니다.
<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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"데이터 처리를 시작하십시오...<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// 확실하게 하다 PHP 버퍼 컨텐츠가 브라우저로 전송됩니다</span></span><span>
</span><span><span class="hljs-comment">// 여기에 몇 가지 장기 실행 작업이 있다고 가정 해 봅시다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">3</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"데이터 처리가 완료되었습니다!<br>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>(); </span><span><span class="hljs-comment">// 나머지 콘텐츠를 새로 고치고 다시 보내십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">flush</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>이 예에서는 먼저 PHP의 출력 버퍼를 활성화하고 ob_flush () 및 flush () 함수를 통해 일부 데이터를 실시간으로 브라우저로 보냅니다. 스크립트가 긴 작업을 수행하는 경우에도 브라우저는 여전히 "시작 프로세스 데이터 ..."를 표시하고 "데이터 처리가 완료되었습니다!" 작업이 완료된 후! "
브라우저 환경에서 FFFLUSH () 함수가 작동하지 않는 이유는 주로 PHP 출력 버퍼링 메커니즘과 HTTP 프로토콜의 한계 때문입니다. 브라우저는 서버 측에서 출력 데이터를 즉시 수신하지 않지만 처리를 시작하기 전에 전체 응답이 완료 될 때까지 기다립니다. 브라우저에서 실시간 출력을 달성하려면 개발자는 일반적으로 버퍼의 새로 고침을 제어하기 위해 OB_FLUSH () 및 FLUSH ()를 사용하여 데이터를 최대한 빨리 브라우저로 전송할 수 있도록해야합니다. 이러한 기술은 장기 실행 스크립트, 실시간 데이터 처리 등과 같은 시나리오에서 특히 중요합니다.