我有下面的代码,想要一一显示回显,但整个结果立即返回
<?php
for ($i = 1; $i <= 10; $i++){
sleep(1);
echo "$i\n";
ob_flush();
flush();
}
在 CGI 中可以,但在 FPM 中不行(PHP 8.3 - apache 2.4)
我尝试了多种方法来解决这个问题,但这些解决方案都不起作用。 以下是其中一些:
ini_set('output_buffering','Off');
ini_set('zlib.output_compression',0);
ini_set('implicit_flush',1);
ob_end_clean();
set_time_limit(0);
ob_implicit_flush(true);
ob_end_flush();
ob_start();
有什么解决办法吗?
fastcgi_buffering
设置为 off
,以将响应立即同步传递给客户端。
使用 Apache 时,使用
mod_fastcgi
,将 -flush
选项添加到 Apache 的 FastCgiExternalServer
指令中,否则如果启用了 mod_deflate
/gzip
,Apache 将缓冲整个响应并延迟到最后才交付它致客户:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -flush -host 127.0.0.1:9000 -pass-header Authorization
源代码和其他解决方案:Streaming PHP - 在 PHP、Apache、Nginx 和 Varnish 中禁用输出缓冲 @ Jeff Geerling。