為什麼 php 指令刷新在 Safari 中不起作用?
P粉141925181
2023-09-04 18:39:18
<p>我有一個耗時的 php 腳本,所以我想給用戶一些回饋。簡化它以解決核心問題。該腳本在 Firefox 中運行得非常好(立即刷新輸出),但 Safari 會等待所有內容生成。為什麼?我該如何解決這個問題? </p>
<pre class="brush:php;toolbar:false;"><?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);
}
?></pre>
<p>順便說一句:Chrome 根本不會加載此頁面,它會給我<code>ERR_CONTENT_DECODING_FAILED</code>。 </p>
<p>此外我還試著把</p>
<pre class="brush:php;toolbar:false;"><IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule></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>/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>
感謝hareth py我找到了答案!
我將 $j 提高到 200,並將睡眠時間降低到 0.1 秒。 Safari 確實反應有點慢,但最後還是會逐行顯示。就像 Firefox 和 Chrome 一樣。
編輯:
ob_start("ob_gzhandler")
旨在用作 ob_start() 的回呼函數,以協助將 gz 編碼的資料傳送至支援壓縮網頁的 Web 瀏覽器。 來源輸出(在 Chrome 上):