>  기사  >  백엔드 개발  >  PHP 플러시 기능 사용 시 주의사항

PHP 플러시 기능 사용 시 주의사항

高洛峰
高洛峰원래의
2016-12-22 16:27:331197검색

ob_* 계열 함수는 PHP 자체의 출력 버퍼를 작동합니다.

그래서 ob_flush는 PHP 자체의 버퍼를 새로 고치는 것입니다.

그리고 엄밀히 말하면 이것은 단지 PHP가 Apache 모듈(핸들러 또는 필터)로 설치된 경우에만 실제 효과가 있습니다.
WebServer의 버퍼를 새로 고칩니다(특히 Apache로 간주할 수 있음).

Apache 모듈에서 플러시는 sapi_module의 플러시 멤버 함수 포인터를 호출하여 간접적으로 Apache의 API를 호출합니다.
: ap_rflush는 Apache의 출력 버퍼를 새로 고칩니다. 물론 설명서에는 Apache의 다른 모듈도 있다고 나와 있습니다.
그럴 수도 있습니다. 변경 이 작업의 결과...

mod_gzip과 같은 일부 Apache 모듈은 자체 출력을 캐시할 수 있으며 이로 인해 플러시() 함수에 의해 생성된 결과가 클라이언트 브라우저로 즉시 전송되지 않습니다. .

브라우저에서도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어 Netscape 브라우저는 줄 바꿈이나 html 태그의 시작 부분을 받을 때까지 콘텐츠를 캐시하고 태그를 받을 때까지 전체 테이블을 표시하지 않습니다.

일부 버전의 Microsoft Internet Explorer
는 256바이트를 수신한 후에만 페이지 표시를 시작하므로 이러한 브라우저가 페이지 콘텐츠를 표시할 수 있도록 하려면 일부 추가 공간을 전송해야 합니다.

따라서 두 가지를 사용하는 올바른 순서는 먼저 ob_flush, 그 다음 플러시입니다.

물론 다른 sapi에서는 코드 이식성을 보장하기 위해 플러시를 호출할 수 없습니다.

<?php
// set_time_limit(0);
header(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);
if (ob_get_level() == 0) ob_start();
echo str_repeat(&#39; &#39; ,4096);
$long = 60;
while($long > 0)
{
$time = date(&#39;r&#39;);
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();//break;
sleep(1);
$long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>

nginx+fpm+php를 지원하려면 응답 헤더를 추가해야 합니다

header( 'X-Accel-Buffering: no');
이것은 Proxy_buffering과 (nginx >= 1.5.6인 경우) fastcgi_buffering을 모두 제거합니다. PHP를 사용하는 경우 fastcgi 비트가 중요합니다. -fpm. 헤더는 필요에 따라 수행하는 것이 훨씬 더 편리합니다.
X-Accel-Buffering 문서 http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering ;

<?php
// set_time_limit(0);
header(&#39;Content-Type: text/event-stream&#39;);
header(&#39;Cache-Control: no-cache&#39;);
header(&#39;X-Accel-Buffering: no&#39;);
 
// ob_end_flush();
// ini_set(&#39;output_buffering&#39;, 0);
// ini_set(&#39;implicit_flush&#39;, 1);
 
// if (ob_get_level() == 0) ob_start();
// echo str_repeat(&#39; &#39; ,4096);
 
$long = 60;
while($long > 0)
{
    $time = date(&#39;r&#39;);
    echo "data: The server time is: {$time}\n\n";
    ob_flush();
     
    flush();//break;
    sleep(1);
    $long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>

PHP 플러시 기능 사용 시 주의사항과 관련된 더 많은 글은 PHP 중국어 홈페이지를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.