為什麼 php 指令刷新在 Safari 中不起作用?
P粉141925181
P粉141925181 2023-09-04 18:39:18
0
2
635
<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>
P粉141925181
P粉141925181

全部回覆(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 上):

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!