如果我从XAMPP上的本地服务器在chrome中加载此脚本:
header("Content-Type:text/plain");
set_time_limit(0);
$max = 40;
for ($i = 0; $i < $max; $i++) {
$response = array( 'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
echo json_encode($response);
ob_flush();
flush();
sleep(1);
}
ob_clean();
它的工作原理和你想象的一样,每一秒页面都会显示一个新的响应,但是当我把它上传到我的远程服务器(运行相同版本的php)时,它会等到整个脚本完成后才显示输出,对于很长的脚本,它每30 - 60秒左右更新一次输出。
正如标题所示,我试过使用所有不同的flush函数,但都不起作用。可能是本地服务器和远程服务器的php.ini有一些不同,但我不知道是什么。
请帮帮我。
- --编辑---
我已经做了一些测试,我注意到它每4096字节更新一次,这恰好是我的远程服务器的php ini中的output_buffering值.然而,由于某些原因,如果我把output_buffering改为'1'或'off',什么都不会改变.它仍然每4096字节更新一次.
我正在同一个浏览器上的不同服务器上测试2个相同的脚本。
4条答案
按热度按时间x7yiwoj41#
我没有考虑nginx,它有自己的输出缓冲区。
我只是添加了“header(“X轴加速缓冲:no”);“到PHP脚本的顶部,现在一切都很好。
dtcbnfnu2#
对我来说,添加
header('Content-Encoding: none');
就可以了,这在使用PHP-FPM时是需要的。hujrc8aj3#
这在Apache + PHP中运行良好
如果您还想丢弃非常小的数据块,也可以添加下面的行(在每个小数据块之后)。
thtygnil4#
在你需要使用ob_start()和ob_end_clean()之前,添加头文件
Content-Length
或Transfer-Encoding: chunked
,并检查php.ini中的“implicit_flush”是否为On为响应添加填充。检查以下代码: