2013-03-10 169 views
6

我有一個腳本運行了1小時。 我有2個虛擬主機,在其中一個虛擬主機中,我可以實時看到輸出(循環一百萬次,回聲),而在另一個虛擬主機上,我必須等到腳本完成運行後才能看到任何輸出在所有。連續顯示PHP輸出?

如何更改設置以實時顯示輸出?我想這是一個php.ini的東西。

添加代碼:此代碼將在第一個服務器中執行時輸出,但不會在第二個服務器中執行。附加信息,如果我把1015的值降低,第一臺服務器等待輸出。所以看起來我的第一臺服務器每1015個字符就會刷新一次,而第二臺服務器卻沒有。

while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    } 
    echo "<br><br>\n"; 
    sleep(1); 
} 

在我的第二臺服務器上,輸出緩衝已關閉,並且我試圖打開implicit_flush無濟於事。

回答

2

請嘗試定期撥打flush。如果您使用的是output buffering,則可能需要使用ob_end_flush或使用ob_flush來關閉該功能。

+0

沒有我的第二臺服務器上的工作。我猜服務器重寫了一些設置。 – 2013-03-10 06:37:22

6

這與輸出緩衝有關。如果打開輸出緩衝,則輸出不會立即發送到客戶端,而是會等待一定數量的數據緩衝。這通常會提高性能,但會導致像您一樣的問題。

簡單的解決方案,不需要更改任何設置php.ini,而只是把這個在你的腳本的開頭:

<?php 
    while (@ob_end_flush()); 
?> 

這將刷新一次,並禁用所有的輸出緩衝。

(來源:http://www.php.net/manual/en/function.ob-end-flush.php#example-460

您可能還需要閱讀PHP手冊上Output Control。相關的php.ini設置列於here

如果您想確保發送內容(即在耗費時間的任務之前),請在適當的時間撥打flush()


編輯:

實際上瀏覽器可能有自己的緩存,尤其是在內容類型未明確設置(瀏覽器需要嗅探MIME類型的文件)。如果是這種情況,您無法控制瀏覽器的行爲。可能解決它

一種方法是明確設置的Content-Type:

header("Content-Type: text/plain"); // if you don't need HTML 
// OR 
header("Content-Type: text/html"); 

但這保證工作。它適用於我的Firefox,但不是Chrome

無論如何,你的最終代碼應該是這樣的:

header("Content-Type: text/html"); // Set Content-Type 
while (@ob_end_flush()); // Flush and disable output buffers 
while ($a++ < 5) { 
    $b = 0; 
    while ($b++ < 1015) { 
    echo "H"; 
    //flush(); // In fact because there is no significant delay, you should not flush here. 
    } 
    echo "<br><br>\n"; 
    flush(); // Flush output 
    sleep(1); 
} 
+0

猜我需要的PHP。ini的東西,沖洗沒有做任何事情在我的服務器上。 – 2013-03-10 05:47:47

+0

@KristianRafteseth Web瀏覽器也可能有自己的緩衝區,所以這可能並不總是服務器端問題。 – 2013-03-10 05:52:06

+0

但即時通訊在同一瀏覽器中使用相同的腳本和同一會話,並在不同的服務器上同時運行兩個腳本。一個顯示輸出馬上,另一個沒有。 – 2013-03-10 06:02:47