2012-09-13 57 views
-1

有沒有辦法讓PHP在頁面執行大型腳本時顯示進度?例如,如果我解析一個大型數組,我可以在整個過程中輸出一個狀態更新?執行期間的PHP進度更新

+0

你到目前爲止發現了什麼? – dbf

+0

頁面是白色的整個腳本解析數組 – user1647347

+0

我只是顯示紡車 – Cjueden

回答

1

有四種方法可以做到這一點我可以想到。我只使用過其中兩個:

1)您可以定期推送輸出(刷新),並希望它通過瀏覽器。這可能僅在某些情況下才起作用 - Web服務器(apache)可能會擁有自己的緩存併爲您保留數據,直到它擁有足夠的數量,ISP/Workplace/User可能擁有自己的緩存,可能直到整個頁面完成後才轉發信息,最後瀏覽器可能無法顯示它。所以不推薦。 (未使用)

2)對本地文件(或數據庫)進行狀態更新,然後通過AJAX進行查詢。這已經在評論中提出,你不需要通過上傳文件。您將使用AJAX調用來啓動流程(使用通用標識符(例如會話來鏈接所有調用)),然後流程將其狀態更新爲文件(鏈接到公共標識符),然後AJAX定期調用服務器並讀取狀態文件。當狀態文件顯示「完成」時,您可以重定向到一個新頁面(使用狀態生成)或只是通過AJAX更新。這種方法效果很好 - 我最近在移動設備上使用它來保持移動站點在等待後臺事件時連接;如果一切都失敗了,我有一個「超時」。

3)分批運行PHP腳本。如果PHP具有最大執行時間並且您可能超過它,那麼您需要這個。基本上,你運行30秒,然後確定一個當前狀態的頁面,並在頭部啓動下一個過程,從最後一個過程開始的元刷新。您通過URL和HTML傳遞狀態。如果你使用這種方法,如果瀏覽器從不從服務器回聽,那麼如果互聯網連接不好,它可能會失敗;所以結合AJAX方法(即AJAX調用「請先做50個,等待完成,更新狀態,請做下50個等待,更新狀態等等)是一個很好的混合解決方案。你還需要確保你的腳本能夠安全地處理如果你從一個先前處理的位置開始處理,那麼處理過程如下:

4)你打開一個從瀏覽器到服務器的javascript套接字,並通過套接字更新我從來沒有使用過這個,因爲瀏覽器支持套接字,但有一些例子可用,如果你知道的觀衆,他們有瀏覽器,支持插座很好。