PHP Flush() 함수 사용 시 주의할 점

怪我咯
풀어 주다: 2023-03-12 21:20:01
원래의
1266명이 탐색했습니다.

매뉴얼의

ob_flush/flush에 대한 설명은 모두 출력 버퍼를 플러시한다고 되어 있으며, 함께 사용해야 하므로 많은 사람들에게 혼동을 줄 수 있습니다... 실제로는 서로 다른 개체에서 작동합니다. 어떤 경우에는 플러시가 전혀 작동하지 않습니다.

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

그래서 ob_flush는 PHP 자체 버퍼를 새로 고칩니다.

그리고 플러시는 엄밀히 말하면 PHP에서만 사용할 수 있습니다. Apache의 모듈(핸들러) 또는 필터)가 설치되면 실제 효과가 있습니다.
WebServer의 버퍼를 새로 고치는 것입니다(구체적으로 Apache를 참조하는 것으로 간주할 수 있음).

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

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

브라우저에서도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어, 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-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 Flush() 함수 사용 시 주의할 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!