Ob_flush/flush는 매뉴얼에 설명되어 있으며 출력 버퍼를 플러시하고 함께 사용해야 하므로 많은 사람들을 혼란스럽게 합니다... 실제로는 서로 다른 개체에 대해 작동하는 경우도 있지만 플러시는 전혀 작동하지 않습니다
ob_* 일련의 함수는 PHP 자체의 출력 버퍼를 작동합니다.
그래서 ob_flush는 PHP 자체 버퍼를 새로 고칩니다.
그리고 플러시는 엄밀히 말하면 PHP에서 아파치 모듈(핸들러 또는 필터)로만 사용할 수 있습니다.
WebServer의 버퍼를 새로 고치기 위한 것입니다(구체적으로 apache를 참조한다고 볼 수 있음).
apache 모듈의 sapi 아래에서는 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-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이미지를 데이터/base64 데이터 스트림으로 변환하는 소스 코드 자세한 설명
phpMicrosoft MSSQL(sql 서버)에 연결하기 위한 전략
위 내용은 PHP 플러시 기능을 사용할 때 주의할 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!