2011-01-12 16 views
9

我有一個使用cURL的php腳本,需要大約10-15分鐘才能執行。它的功能是,解析大約1000頁尋找特定匹配,並在整個腳本中回顯出診斷消息,如「進入下一頁」,「找到匹配項」,「錯誤加載頁面」...現在它的工作方式(以及它正常的方式)是它執行10分鐘,然後只吐出我所有的自定義消息。 我希望能夠在它們發生時顯示這些消息,而不是在腳本完成執行時顯示這些消息。我正在考慮像AJAX這樣做,但我不確定它會如何工作。任何提示,非常感謝。謝謝。php腳本仍在執行時回覆郵件

+1

爲[這個問題的類似的一個新行(http://stackoverflow.com/questions/4481235/php-flush-ob-flush-not-working)。 – netcoder 2011-01-12 14:28:09

+0

另一個簡單的例子是從命令行執行腳本,這樣你就可以實時獲得回顯。 – 2011-01-12 14:28:49

回答

9

所以,這是一箇舊帖子,但我找到了一個解決方案。因爲我也必須做出同樣的事情,所以當腳本仍在運行時輸出。沒有任何答案從這裏幫助。 首先,我使用Win32服務器(生產)和XAMPP作爲本地進行測試。這個例子只是一個概念證明,可以隨意修改。

<?php 
ob_implicit_flush(true); 
for($i=1; $i<=10; $i++){ 
echo "$i ...<br>"; 
for($k = 0; $k < 40000; $k++) echo ' '; 
sleep(1); 
} 
?> 

因此,我們打開輸出緩衝區爲隱式。然後我們製作一個演示循環,從1到10進行計數,並在處理值時顯示這些值。第二個循環將填充瀏覽器緩衝區。最後,檢查一切是否正常,我們睡1秒鐘。否則,劇本將運行得太快,我們不知道我們是否實現了目標。 希望這有助於!

6

通過刷新輸出緩衝區,使用flush可立即將輸出發送到瀏覽器。

echo "foo"; 
flush(); 
echo "bar"; 
flush(); 
+1

Flush不保證能在所有瀏覽器/平臺/配置下工作 – mrbinky3000 2011-01-12 14:34:52

7

您可以創建臨時表。

PHP腳本可以代替回顯消息,將它們存儲到數據庫表(可能用於性能的內存表)中。

然後,您可以使用ajax定期輪詢一個單獨的PHP腳本,該腳本將查詢該表並將任何新消息返回給客戶端。

+0

同意。沖洗將無法100%的時間。 Ajax是必需的。 – mrbinky3000 2011-01-12 14:39:10

+0

沒有推式解決方案(而不是輪詢)? – Richard 2014-11-23 21:49:35

0

基本上,您的腳本將HTML輸出寫入臨時日誌文件。然後使用ajax定期用臨時日誌文件更新最終用戶的瀏覽器。 jQuery將爲此做出快速的工作。

Ajax是讓它在所有瀏覽器上都能正常工作的唯一保證方式。這是來自PHP的同步頁面的引用。

的flush()可能無法覆蓋 您的Web服務器 的緩衝機制,而且它在瀏覽器中任何 客戶端緩存沒有影響。 它也不影響PHP的用戶空間 輸出緩衝機制。這意味着 如果您正在使用這些緩衝區,則必須調用ob_flush() 和flush()以刷新ob輸出 緩衝區。

3

實際上,您正在尋找像flushob_flush之類的東西,但請記住,有很多因素會阻止您的輸出在發生時被刷新。

flush文檔,你會得到:

幾臺服務器,特別是在Win32中,仍然會緩存腳本的輸出,直到它的結果發送到瀏覽器之前終止。

像Apache等mod_gzip服務器模塊可能會做自己的緩衝,這將導致flush()不會導致數據立即發送到客戶端。

0

你可以同時使用flushob_flush,提醒設置內容類型標題:

<?php 
header('Content-type: text/html; charset=utf-8'); 
for($i = 0 ; $i < 10 ; $i++){ 
    echo $i . '<br>'; 
    flush(); 
    ob_flush(); 
    sleep(1); 
} 

來源:dermeister注意在php.net ob_flush頁。

測試火狐42.0和Chrome 46.0

1

我使用@ob_flush()echo後。在這個例子中PHP_EOL創建後$string

function output($string){ 
    echo $string.PHP_EOL; 
    @ob_flush(); 
}