[英]PHP Flush() not working in Chrome
我偶然發現了這個功能,它承諾可以在IE,FF和Chrome上運行。 但它在Chrome中不起作用。 有工作嗎?
function buffer_flush(){
echo str_pad('', 512);
echo '<!-- -->';
if(ob_get_length()){
@ob_flush();
@flush();
@ob_end_flush();
}
@ob_start();
}
以下是我在Chrome 12.0.742.122中使用PHP 5.3.6在while循環中使用flush()的方法:
echo("<html><body>");
while(1) {
echo(str_pad($my_string_var,2048," "));
@ob_flush();
flush();
}
使用較小的str_pad值也可以工作,但第一個輸出顯示需要更長的時間。 如果缺少任何其他行,則不會出現任何內容。
“@”並不是絕對必要的,但它可以防止日志填滿“緩沖區中沒有任何內容”的注意事項。
當然,如果你有一個預先存在的頁面,只需確保<html>
和<body>
標簽在那里; 我是從頭開始寫一個頁面的。
使用flush()
/ ob_flush()
您只能將輸出發送到瀏覽器,但是當它顯示時,它仍然可以到瀏覽器。 我假設,Chrome只是等待,直到它收到足夠的數據來顯示“有用的”頁面,而不是一些片段。
反正有些建議:
@
(特別是如果你不確切知道,它做什么) 如果不調用ob_end_*()
,則無需再次調用ob_start()
。 效率低下
function buffer_flush(){ echo '<!-- -->'; // ? ob_flush(); flush(); }
某些瀏覽器(至少IE6,可能是chrome)在輸出任何內容之前需要一定數量的“有用”字符(即非空格)。 在IE6的情況下,甚至需要推送壓縮數據的大小。
function force_flush() {
echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
for ( $i = 0; $i < 5; $i++ )
echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";
while ( ob_get_level() )
ob_end_flush();
@ob_flush();
@flush();
} # force_flush()
我發現內容類型標題在經過一些試驗和錯誤后確實能夠在chrome中運行。
但我不知道為什么鉻不會沖洗。
在搜索更多答案后,我讀到只有在設置了有效內容類型時才會按預期刷新Chrome。 精細。
這是我試驗的代碼。
<?php
header('Content-Type: text/html; charset=UTF-8');
echo 'starting...';
flush();
echo 'to sleep...';
flush();
sleep(5);
echo 'awake';
如果我不包括內容類型標題,我會在5秒后一次性獲得以下內容。 所以我們所期望的不起作用。
開始...睡覺...顯示喚醒並且腳本終止。
在那里,當我給出類似上面的內容類型的子類型(charset)然后
立即顯示開始......睡覺...然后顯示5秒鍾后喚醒。
我只是盲目地假設關於內容類型標題chrome顯示輸出。
此外,當我提供'Content-Type:text / plain'或'Content-Type:text / html'時,它不起作用。 它只適用於子類型'charset = [sometexthere]'。
正如申請/ json的工作。 我沒有嘗試更多的啞劇演員。
我在這里的原因是
我想在ajax響應中使用readystate 3。 除鉻和野生動物園外,它的工作正常。 因為chrome使用的是webkit,所以我認為它們都是一樣的。
在包括IE在內的其他瀏覽器中,刷新正在按預期工作,而readystate = 3但在chrome和safari中我只使用了上述解決方法。
這是來自上面的php腳本的readystate - responsetext的截圖
在圖像中有兩組響應,第一個具有readystate 3,而responsetext在沒有使用內容類型時為空。
在第二個響應中,您可以看到就緒狀態3具有帶有預期輸出的responsetext。 這是使用內容類型的時候。
所以... Chrome只知道。
當使用str_pad時
使用字符串填充時,可以獲得更多預期結果。 我嘗試使用1024作為上面的答案建議但只有內容類型設置。
如果使用填充並且沒有設置內容類型,則它不起作用。
和
我提出了一個與此類似的問題 ,我將通過將此答案與背靠背鏈接起來添加我自己的答案......這樣用戶就可以輕松獲得更多詳細信息。 hhmmm。
有幾個組件可能會對此問題產生影響。
請仔細閱讀此功能的文檔: http : //www.php.net/manual/en/function.flush.php
我的一個解決方案是使用Apache2與mod-php(不是作為fcgi而是作為本機apache-module)和Chromium。 結果立即出現,腳本仍在運行並發送更多結果。
鍵入以下兩個代碼行后,每個echo-command都會立即將文本推送到whatever-PHP-backend :
ob_implicit_flush(1);
@ob_end_flush(); // set an end to the php-output-buffer!
但是這個php后端可以擁有自己的緩沖區。 例如,我運行nginx作為webserver,而fast-cgi模塊使用php。 Nginx本身有自己的緩沖區......依此類推。
瀏覽器也可以緩沖請求。 但是,正如我所經歷的Chromium(或谷歌瀏覽器)有一個很小或沒有緩沖區。
請閱讀我提到的每個功能的文檔,以了解它們的真正作用 - 但特別是flush()的文檔。
個人提示:不要將額外的字符放入輸出緩沖區,而是閱讀並理解服務器的配置。
編輯:如果你啟用了gzip,服務器的整個響應將被緩沖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.