我需要顯示從我的PHP腳本連續輸出。該腳本將停留在從設備打印日誌數據並進入休眠狀態的循環中。我的問題是,在腳本完成之前,我無法讓PHP或Apache輸出數據。停止PHP輸出緩衝
我已經嘗試了用於刷新輸出緩衝區的所有命令,並且我已經通過配置文件讀取了PHP和Apache尋找某種類型的緩衝以禁用的配置文件。
這是可能與Apache和PHP在Windows上,或者我應該考慮一些其他平臺?
我需要顯示從我的PHP腳本連續輸出。該腳本將停留在從設備打印日誌數據並進入休眠狀態的循環中。我的問題是,在腳本完成之前,我無法讓PHP或Apache輸出數據。停止PHP輸出緩衝
我已經嘗試了用於刷新輸出緩衝區的所有命令,並且我已經通過配置文件讀取了PHP和Apache尋找某種類型的緩衝以禁用的配置文件。
這是可能與Apache和PHP在Windows上,或者我應該考慮一些其他平臺?
的最好方法(最可靠和最乾淨的)來完成,這是使用服務器端腳本做的工作,和一個客戶端AJAX腳本,它將輪詢另一個將返回狀態的服務器端腳本。在網絡中,數據在不同層次上進行緩衝,以實現優化,因此很難實現您想要的。
使用這些刷新已經使用的輸出緩衝區命令,然後輸入一個長度爲1024字節的HTML註釋。因爲這很可能是瀏覽器問題,而不是服務器。
啊,看起來像您正在尋找的COMET應用
PHP的output_buffering
默認情況下設置爲0(即關閉),但您毫無疑問會對此進行調查。
我認爲@Palantir's suggestion可能是一個很好的方法:將日誌條目寫入本地文件,然後將該文件(或其部分)提供給客戶端;客戶可以重新請求,但是您經常需要。這也有一個好處,就是不會填滿瀏覽器的緩衝區(也就是說,你不應該只是不停地發送日誌數據到客戶端無限)。
但這不是你的問題。
你能用如下簡單的腳本重現輸出緩衝問題嗎?
<?php
while (TRUE)
{
echo 'x';
flush();
sleep(1);
}
?>
我已經嘗試過這樣一個簡單的腳本,但它不會給我任何輸出。 – Torstein 2010-06-24 08:14:36
是的,我一直在考慮客戶端輪詢,但我試圖避免不必要的延遲,但如果沒有其他可行的辦法,我會採取這種方法。 – Torstein 2010-06-24 06:50:57
相反,這應該會給你的客戶一個更好的表現,而不是一個更壞的表現:如果你遵循你的方法,你永遠不會確定文本何時被輸出,因爲它將取決於瀏覽器的實現。與AJAX方法相反,如果您以1秒的間隔進行輪詢,則您將確保客戶端每隔1秒更新一次,這對任何Web用戶都應該足夠好。 – Palantir 2010-06-24 06:59:02
好的,有道理。我會嘗試這種方法,謝謝。 – Torstein 2010-06-24 07:03:47