2010-06-09 68 views
3

我正在使用PHP中的工具處理大量數據,需要一段時間才能完成。我想讓用戶更新正在發生的事情和處理當前任務。動態顯示進度信息

你認爲最好的辦法是做什麼?我有一些想法,但不能決定一個最有效的:

  • 舊的方式:執行腳本的一小部分,並用元重定向或一個JavaScript計時器顯示頁面給用戶發送請求以繼續該腳本(如/script.php?step=2)。

  • 不斷髮送AJAX請求以讀取PHP通過fwrite()持續更新的服務器文件。

  • 同上,但PHP更新數據庫中的一個字段而不是保存文件。

這些聽起來不錯嗎?有任何想法嗎?

謝謝!

回答

5

而不是寫入到您使用AJAX或額外的數據庫字段獲取的靜態文件,爲什麼沒有另一個PHP腳本只是返回指定任務的完成百分比。然後,您的頁面可以通過對所述PHP腳本的輕量級AJAX請求更新進度。

對於實施這個「進度」腳本,如果我對「處理大量數據」的含義有更多的瞭解,我可以提供更多的建議。如果您正在寫入文件,您的「進度」腳本可以簡單地檢查文件大小並返回完成的百分比。對於更復雜的任務,您可以爲特定流程分配基準,並基於最後完成或當前正在運行的流程返回估計完成百分比。

UPDATE

這是「檢查進展」,它被簡單地等待來自請求的響應的有源腳本的一個建議的方法。我有一個數據挖掘應用程序,我使用了類似的方法。

在您的腳本中,您正在等待的腳本(您要檢查腳本的進度),您可以存儲(在文件或數據庫中,我使用數據庫,因爲我有數百個進程任何時候都需要跟蹤他們的進度,而且我有另一個腳本,可以監視這些進程的進度)進程變量。當過程開始時,將其設置爲1.您可以輕鬆選擇腳本將傳遞的任意數量的「檢查點」,並計算給定當前檢查點的百分比。然而,對於一個大的請求,你可能更感興趣的是知道請求完成的大概百分比。一種可能的解決方案是知道返回內容的大小,並根據任何時候收到的百分比設置您的狀態變量。即如果您在循環中接收到請求數據,則每次迭代都可以更新狀態。或者,如果您正在下載到平面文件,則可以輪詢文件的大小。如果知道完成請求所需的大概時間,並簡單地與腳本的當前執行時間進行比較,那麼隨着時間的推移(而不是文件大小),這可能會不準確。顯然,這些都不是完美的解決方案,但我希望他們能給你一些洞察你的選擇。

+0

嗨達斯汀,這個工具是一個提要爬蟲,所以大部分的過程只是在等待響應。你如何讓另一個PHP腳本「調用」一個活動腳本來獲取百分比?謝謝! – 2010-06-09 21:18:50

+0

我已經更新了關於如何去做的簡短討論:) – defines 2010-06-10 13:48:26

+0

感謝Dustin的詳細解釋! – 2010-06-11 09:25:25

1

我建議使用AJAX方法,但不要使用文件或數據庫。你可以使用會話值或類似的東西,這樣你就不必創建連接或打開文件來做任何事情。

+0

PHP會話存儲在文件中。 – 2010-06-09 20:42:07

+0

不一定,默認購買,是的。我仍然認爲它比你的讀者更快,並且自己寫作。 – 2010-06-09 21:14:03

+0

不錯,不知道你能做到這一點。這是迄今爲止我讀過的最簡單但最有效的解決方案,但是如何設置會話存儲方法?如果不在文件中,它們存儲在哪裏,RAM可能? Cheers Kerry – 2010-06-09 21:23:19

1

在過去,我剛剛寫出消息到頁面,並使用flush()來刷新輸出緩衝區。非常簡單,但它可能無法在每個Web服務器或每個Web瀏覽器上正常工作(因爲它們可能會執行自己的內部緩衝)。

就我個人而言,我喜歡你的第二選擇最好的。應該是可靠和相當簡單的實施。

+0

我會經常爲我在本地服務器上使用的個人工具(如果您是唯一一個能夠看到它的人,爲什麼會打擾AJAX?)這樣做,但我不會在生產環境中依賴此工具。 – defines 2010-06-09 20:34:25

1

我喜歡選項2 - 使用AJAX讀取PHP定期寫入的狀態文件。這打開了很多不同的演示文稿選項。如果你爲這個文件寫了一個JSON對象,你可以很容易地解析它,並顯示一些東西,比如進度條,狀態消息等等......

0

一個'骯髒'但快速簡單的方法就是回顯腳本運行的狀態。只要你沒有輸出緩衝,瀏覽器就會呈現HTML,因爲它從服務器接收它(我知道WordPress使用這種技術來自動升級)。

但是,一個'更好'的方法是AJAX,但我不會說'分手'使用重定向有任何問題。

爲什麼不合並1 & 2,其中AJAX發送請求到script.php?step=1,檢查響應,寫入瀏覽器,然後返回更多script.php?step=2等等?

0

如果您可以取消IE然後使用服務器發送的事件。它是理想的解決方案。