为什么 php 命令刷新在 Safari 中不起作用?
P粉141925181
P粉141925181 2023-09-04 18:39:18
0
2
463
<p>我有一个耗时的 php 脚本,所以我想给用户一些反馈。简化它以解决核心问题。该脚本在 Firefox 中运行得非常好(立即刷新输出),但 Safari 会等待所有内容生成。为什么?我该如何解决这个问题?</p> <pre class="brush:php;toolbar:false;">&lt;?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 &quot;One moment please...&quot;.str_pad('', $k).&quot;&lt;br /&gt;\n&lt;br /&gt;\n&quot;; flush(); $i = 0; while ($i &lt; $j) { $i++; echo &quot;Test &quot;.$i.str_pad('',$k).&quot;&lt;br /&gt;\n&quot;; flush(); sleep(1); } ?&gt;</pre> <p>顺便说一句:Chrome 根本不会加载此页面,它会给我<code>ERR_CONTENT_DECODING_FAILED</code>。</p> <p>此外我还尝试把</p> <pre class="brush:php;toolbar:false;">&lt;IfModule mod_env.c&gt; SetEnv no-gzip 1 &lt;/IfModule&gt;</pre> <p>在 .htaccess 但没有运气。还尝试了<code>SetEnv no-gzip dont-vary</code>。有什么线索可以让 Safari(和 Chrome)做与 Firefox 一样的事情吗?</p> <hr /> <p>我在 php.net 上阅读了有关 <code>flush()</code>、<code>ob_flush()</code>、<code>ob_start()</code> 等的所有内容,并且我几乎阅读了关于flush的每个问题+过去20多年来Stackoverflow上的所有评论。 我尝试添加 <code>ini_set('output_buffering', 'On');</code> 或 <code>ini_set('output_buffering', 'Off');</code>,添加 <code>ob_start(null,第4096章<code>header('X-Content-Type-Options: nosniff');</code> 和/或 <code>header('X-Accel-Buffering: no');</code>。我将 <code>@ob_flush();</code> 放在 <code>flush();</code> 之前或之后,尝试将 <code>str_pad</code> 中的值提高到 2^16 ( 65,536)但没有任何帮助。</p><p> 不幸的是,我似乎无法控制托管提供商处的 Apache 服务器(运行 PHP 8.1 和 FastCGI)。既然它可以在 Firefox 上运行,我想我一定做对了。</p>
P粉141925181
P粉141925181

Antworte allen(2)
P粉684720851

感谢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 一样。

P粉762447363

编辑:
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 上):

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!