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('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); if (ob_get_level() == 0) ob_start(); echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); 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('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('X-Accel-Buffering: no'); // ob_end_flush(); // ini_set('output_buffering', 0); // ini_set('implicit_flush', 1); // if (ob_get_level() == 0) ob_start(); // echo str_repeat(' ' ,4096); $long = 60; while($long > 0) { $time = date('r'); 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 중국어 홈페이지를 참고해주세요!