2014-02-25 193 views
2

我編寫了一個php的網頁。頁面中有一個while循環,用於從數據庫中檢索數據,並使用數據執行某些邏輯並更新數據庫中的相同數據。這個循環需要4分多鐘才能完成循環的整個處理。然後處理剩餘的頁面代碼。PHP的強制停止頁面加載

現在,在一些時間,而頁面加載了while循環的過程,它尚未完成,如果我按Esc鍵按鈕,這意味着,我強迫從多個處理停止頁面。現在,如果我突然刷新頁面,則需要很長時間才能在同一網站上加載任何頁面。我認爲當我突然刷新頁面時,循環的其餘部分正在完成。

我想這個頁面正常重新加載頁面,並且不依賴於先前停止動作。

在你心中是否有解決這個問題的方法?我也通過Ajax嘗試過,但同樣的問題仍然存在。

+0

你描述的行爲很奇怪,在正常情況下不應該發生。資源鎖定是否存在問題?即。您取消的腳本仍在運行並鎖定新腳本試圖打開的文件?或者,也許你正在寫/讀同一個(鎖定的)數據庫表? – Halcyon

+0

@FritsvanCampen如果你正在進行一些激烈的數據庫查詢......或者真的需要4分鐘才能完成,這並不奇怪。 – Brad

+0

(1)確保'ignore_user_abort'已關閉,並且循環中有垃圾郵件空間(應該沒有區別它是HTML,但Web服務器需要意識到存在斷開連接,但如果這不起作用,不要在web服務器上做很大的工作:在其他地方使它成爲一個異步作業,比如使用'gearman',這假設數據庫本身不是問題 – Wrikken

回答

1

你需要做的是關閉產卵要求,做工作的外部進程,然後報告回結果。

我通常在包含作業隊列的數據庫中使用表格。當一個工作請求進入時,它登陸數據庫。有一個cron作業每分鐘檢查一次新作品,或者如果沒有任何作業正在進行,我會啓動代碼以運行作業。

表中更新了工作的狀態(已完成的百分比和未完成的工作)。當站點上的用戶請求結果時,他們可以查看狀態,或者在完成時查看數據。

+0

會請你解釋這多一點「的要求產卵關閉外部進程,然後報告回結果」您這麼寶貴的時間 –

+0

感謝,也可以請你告訴我怎麼知道沒有cron作業運行和在那個時候在cron作業上運行這個代碼? –

+0

@SumanAnsari如果您使用cron作業方法,則cron作業應檢查數據庫表以查看現有作業是否正在進行。您還應該保存執行該工作的進程的PID,以便您的cron作業可以檢查該進程是否仍在運行。 HTTP://計算器如果你不使用cron作業,看到了這個問題(例如,過程可能會開始工作,和崩潰,永遠無法更新表表明,它的完成。) – Brad