2013-12-14 153 views
0

更新這是一個問題,我有:PHP的循環不要在瀏覽器

如何更新瀏覽器的頁面(瀏覽器,Firefox)時,迴路的負載,例如:

<?php 
    $var = 0; 
    while($var != 10){ 
     echo $var; 
     $var++; 
     sleep(1); 
    } 

?> 

頁不要更新,只有在PHP腳本執行完成後,任何東西都可以幫助我?謝謝。

+9

PHP的服務器上運行 - 如果你需要在瀏覽器窗口中「實時」的東西,你需要使用瀏覽器中運行的東西(例如Javascript)。 – Floris

+2

爲什麼你會在那裏使用'sleep()'? – randak

+0

@randak也許只是爲了好玩..我也這樣做過..就像測試longpolling .. – Hardy

回答

1

你可以這樣說:

<?php 

    if (ob_get_level() == 0) ob_start(); 

    for ($var = 0; $var <= 10; $var++) { 
     echo $var; 
     ob_flush(); 
     flush(); // echo output buffer to client 
     sleep(1); 
    } 

    ob_end_flush(); 

?> 

爲了使這項工作,你應該有一個像這樣在PHP設置中禁用輸出壓縮:

zlib.output_compression = Off 

或嘗試在代碼中禁用它(如果允許):

if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 
+0

缺少一個'{'。剛剛在http://www.floris.us/SO/liveEcho.php上測試過 - 似乎沒有用。 – Floris

+0

是的..謝謝..修復。 – Hardy

+0

修正了'{'但是看到我的鏈接。這段代碼的精確副本(帶有「{」) - 在我的瀏覽器中全部顯示(10秒後)。 – Floris

0

這基本上是不可能的。

PHP在其引擎中使用自己的輸出緩衝(php://output)。該緩衝區會填充您在代碼中回顯的數據。一旦引擎到達腳本末尾,它將刷新整個緩衝區並將其附加到網絡服務器開始創建的頭信息(想象一下,網絡服務器是預先準備好對瀏覽器和PHP的響應的網頁服務器是添加實際內容的人)。

另一個限制是某些瀏覽器等到整個HTTP請求完成後纔開始渲染站點。並非所有這些,但一些。

對於真實的活動,我會推薦AJAX或更現代的WebSockets。第二個更生動,因爲它不會像AJAX一樣重新加載。我建議你重新考慮你想要做什麼,如果它是必要的。

一些維基百科文章,我建議你看看,如果你不明白什麼: