PHP 플러시 기능을 사용할 때 주의할 점

墨辰丷
풀어 주다: 2023-03-29 08:04:01
원래의
1407명이 탐색했습니다.

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(&#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이미지를 데이터/base64 데이터 스트림으로 변환하는 소스 코드 자세한 설명

phpMicrosoft MSSQL(sql 서버)에 연결하기 위한 전략

에서 키워드 사용 PHP 및 파일 로딩

위 내용은 PHP 플러시 기능을 사용할 때 주의할 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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