我有一个耗时的 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 一样的事情吗?
我在 php.net 上阅读了有关 flush()、ob_flush()、ob_start() 等的所有内容,并且我几乎阅读了关于flush的每个问题+过去20多年来Stackoverflow上的所有评论。
我尝试添加 ini_set('output_buffering', 'On'); 或 ini_set('output_buffering', 'Off');,添加 ob_start(null,第4096章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 上运行,我想我一定做对了。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
感谢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 一样。
编辑:
ob_start("ob_gzhandler")旨在用作 ob_start() 的回调函数,以帮助将 gz 编码的数据发送到支持压缩网页的 Web 浏览器。 来源<?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 上):