簡體   English   中英

PHP Flush()無法在Chrome中運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM