2012-06-28 123 views
1

工作我們有這個簡單的腳本能正常工作放在其輸出數每秒瀏覽器無法獲得在Windows

<? 
    for ($i=0; $i<3; $i++) 
    { 
     echo $i.'<br>'; 
     flush(); 
     sleep(1); 
    } 

但是在我的地方發展盒Ubuntu的測試服務器的flush()( Windows環境)我無法讓它工作,它會在3秒後輸出。

我在本地盒子上使用相同的php版本(5.3.13)以及apache(2.2.22)版本作爲測試服務器。 我已鏡像的大部分設置在兩個php.ini中以及在httpd.conf 下面是

output_buffering 0 
zlib.output_compression = Off 
zlib.output_compression_level = -1 

我沒有mod_gzip的安裝設置我已經設置(其等同於測試服務器) 。

我甚至試過在我的盒子上安裝一個wamp,並且它也沒有工作。

我無法想象它是一個客戶端(瀏覽器 - 火狐13)問題,因爲我用的是完全一樣的瀏覽器來查看測試服務器上的腳本和

我曾嘗試它工作正常啓用隱平齊,做ob_flush等沒有運氣。

任何人有任何想法如何讓這個工作?

+1

網絡服務器可以緩衝,瀏覽器可以緩衝(MSIE着名不會呈現,直到它有一個最小的輸出量),任何服務器跳可以緩衝等HTTP/HTML頁面不應該被認爲是一個'運行控制檯「,但是很多人喜歡它。 – Wrikken

+0

我記得前一陣子遇到同樣的問題,我重新考慮了整個處理邏輯。我最終從PHP獲得了「text/plain」類型的「動態」數據,並使用Javascript做了很酷的HTMLy內容。換句話說,把它放在你的代碼頭部('Content-type:text/plain');' – Adi

+0

對不起,我的老闆進來跟我說話。設置標題沒有幫助 – Kris

回答

2

請記住@Wrikken所說的,不建議這樣做。

所以我在想,你所做的一切似乎都是正確的。我複製你的設置並嘗試。我面臨同樣的問題。我從命令行執行腳本,它工作。然後我不得不做最後一次測試,Wireshark。在第一對數據包之後,顯然服務器正確地發送了一切,所以它必須是瀏覽器的緩衝區。

所以我試着在循環之前發送一些數據,猜猜是什麼?有效!

在這裏你去:

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
echo str_repeat(" ", 1024), "\n"; 
for($i=0;$i<6;$i++) { 
     echo $i."<br />\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 

我不知道你心目中的應用程序,但是這顯然不是一個好主意,我強烈建議你看看其他的選擇。

更新: 長時間的谷歌搜索後,我發現thisthis

因爲瀏覽器無法正確渲染頁面,不知道如何 構建頁面的人物,大多數瀏覽器緩存一定 數之前執行任何JavaScript或繪製頁面

爲了避免這些延遲,應該總是儘可能早地指定字符 編碼,對於任何HTML文檔大於1 KB (1024字節,準確地說,這是由所使用的最大緩衝區限制 我們測試過的任何瀏覽器)。

所以我試圖發送的字符集,而不是先填充緩衝的:(和它的工作)

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
//echo str_repeat(" ", 1024), "\n"; 
header('Content-Type: text/html; charset=iso-8859-1'); 
//Note that it shoudn't matter which charset you send 
for($i=0;$i<6;$i++) { 
     echo $i."<br />\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 

那麼,爲什麼它的第一個服務器而不是第二工作?

很可能是因爲你的第一臺服務器發送字符集與頭,而第二個不是。

在你的情況,不過,我會做如下修改

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
//Plain text MIME type since you'll use for logging purposes 
//and if you run it from CLI, you can ignore the whole header line 
header('Content-Type: text/plain; charset=iso-8859-1'); 
for($i=0;$i<6;$i++) { 
     //No need to echo <br /> once you'll run it from CLI 
     echo $i."\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 
+0

謝謝你的工作!我需要它的原因是我正在做一個處理大量腳本,需要30分鐘運行,我將在CLI中每週運行一次cron。在開發過程中,我想刷新,這樣我就可以確保它正確運行整個過程,而無需等到執行完成。一旦我確定它可以正常工作,我將把flush變成日誌記錄。 – Kris

+0

但是我不明白的一件事是,如果它是瀏覽器緩衝區,當我在ubuntu服務器上運行腳本時,它如何正常工作,但不是我的本地服務器(在這兩種情況下,我都在我的機器上使用瀏覽器) – Kris

+1

@Kris,我更新了我的答案以提供進一步的解釋 – Adi

1

我已經找到了我的問題的解決方案。 出於某種原因,加上線

default_charset = "utf-8" 

爲了我的php.ini使得它的工作。 我確認我的刪除線..沖洗沒有工作。 添加它,它工作。也許是因爲它增加了足夠的瀏覽器緩衝區。

+0

很好的抓住!!!!! – Adi