我有一个耗时的php脚本,所以我想给予用户一些反馈。简化了它以找到核心问题。这个脚本在Firefox中运行得很好(立即刷新输出),但Safari会等到所有内容都生成之后才执行。为什么?我该怎么弥补?
<?php
ini_set('max_execution_time', 0);
header('Content-Encoding: none;');
header('Content-type: text/html; charset=utf-8');
$j = 8;
$k = pow(2, 10);
echo "One moment please...".str_pad('', $k)."<br />\n<br />\n";
flush();
$i = 0;
while ($i < $j) {
$i++;
echo "Test ".$i.str_pad('',$k)."<br />\n";
flush();
sleep(1);
}
?>
顺便说一句:Chrome根本无法加载此页面,它给了我ERR_CONTENT_DECODING_FAILED
。
此外,我试图把
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
在.htaccess但没有运气。我也试过SetEnv no-gzip dont-vary
。有什么线索可以让Safari(和Chrome)和Firefox做得一样吗?
我在www.example.com上阅读了php.net关于flush()
、ob_flush()
、ob_start()
等的所有内容。而且我几乎阅读了所有关于flush的问题+过去20+年来Stackoverflow上的所有评论。我尝试添加ini_set('output_buffering', 'On');
或ini_set('output_buffering', 'Off');
,添加了ob_start(null, 4096);
,ini_set('zlib.output_compression', 'Off');
,header('Cache-Control: no-cache');
,header('X-Content-Type-Options: nosniff');
和/或header('X-Accel-Buffering: no');
。我将@ob_flush();
放在flush();
之前或之后,试图将str_pad
中的值提高到2^16(65,536),但没有任何帮助。
不幸的是,我似乎没有任何控制Apache服务器在我的主机提供商(它运行PHP 8.1与FastCGI)。既然它能在Firefox上运行,我想我一定做对了什么。
2条答案
按热度按时间qf9go6mv1#
感谢hareth py我找到了答案!
我把$j提高到200,把睡眠时间降低到0.1秒。Safari的响应确实有点慢,但它最终会逐行显示。就像Firefox和Chrome一样。
zwghvu4y2#
编辑:
ob_start("ob_gzhandler")
被用作ob_start()的回调函数,以帮助将gz编码的数据发送到支持压缩网页的Web浏览器。source输出(在Chrome上):
请稍等...
测试1测试2测试3测试4测试5测试6测试7测试8