Chrome 为什么php命令flush在Safari中不起作用?

mspsb9vt  于 2023-05-11  发布在  Go
关注(0)|答案(2)|浏览(224)

我有一个耗时的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上运行,我想我一定做对了什么。

qf9go6mv

qf9go6mv1#

感谢hareth py我找到了答案!

<?php 
ini_set('max_execution_time', 0);
header('Content-Encoding: none;');
header('Content-type: text/html; charset=utf-8;');
ob_start("ob_gzhandler");
$j = 200;
$k = pow(2, 10);

echo "One moment please...".str_pad('', $k)."<br />\n<br />\n";

$i = 0;
while ($i < $j) {
    $i++;
    echo "Test ".$i.str_pad('',$k)."<br />\n";
    ob_flush();
    usleep(100000);
} 
?>

我把$j提高到200,把睡眠时间降低到0.1秒。Safari的响应确实有点慢,但它最终会逐行显示。就像Firefox和Chrome一样。

zwghvu4y

zwghvu4y2#

编辑:

ob_start("ob_gzhandler")被用作ob_start()的回调函数,以帮助将gz编码的数据发送到支持压缩网页的Web浏览器。source

<?php
ini_set('max_execution_time', 0);
header('Content-Encoding: none;');
header('Content-type: text/html; charset=utf-8');
ob_start("ob_gzhandler");
$j = 8;
$k = pow(2, 10);

echo "One moment please...".str_pad('', $k)."<br />\n<br />\n";

$i = 0;
while ($i < $j) {
    $i++;
    echo "Test ".$i.str_pad('',$k)."<br />\n";
    ob_flush();
    sleep(1);
}
?>

输出(在Chrome上):
请稍等...
测试1测试2测试3测试4测试5测试6测试7测试8

相关问题