2011-09-30 42 views
0

我有一個簡單的網頁(PHP,JS和HTML),它被顯示來說明計算正在進行中。這個計算是由觸發的一個PHP腳本的JavaScript AJAX請求進行實際計算。 有關詳細信息,請參閱 here確定/規避AJAX請求是否超時的方法?

實際計算是什麼,沒有起到作用,所以爲了簡單起見,它只是一個sleep() - 命令。

當我在本地執行相同的代碼(瀏覽器在localhost下調用網站:linux,apache,php-mod)時,它工作正常,與睡眠時間無關。但是,當我讓它運行在不同的機器上(不是本地主機,而是Linux,Apache,php-mod)時,PHP腳本確實會運行(創建結果),但AJAX請求不會得到任何迴應,所以如果睡眠時間大於900秒,就沒有「onreadystatechange」。當睡眠時間爲< 900秒時,它也很好地工作,並且AJAX請求被正確終止(readyState == 4和狀態== 200)。

的Apache和PHP的配置更或默認少,我驗證的關鍵選項已經存在(的max_execution_time等),但沒有看起來那麼他們要麼縮短(< 1分鐘)或更大,例如爲有效這裏爲垃圾收集器(24分鐘)。

所以我很困惑什麼可能會導致這種情況。我認爲它可能與網絡有關,但我在路由器中沒有找到合適的選項。 也沒有錯誤報告在Apache日誌或在PHP(錯誤登錄到文件)。

讓AJAX請求的JavaScript在成功返回時顯示request.status,令人驚訝的是,當我在睡眠結束後在瀏覽器窗口中點擊「Esc」時,我也會顯示狀態「200」,但不會自動顯示因爲它應該這樣做。

無論如何,我希望你可以有一個想法如何規避這個問題? 也許每10分鐘左右客戶端和服務器之間的虛擬通信可能會有所訣竅,但我不知道如何最好地做到這一點,尤其是讓用戶透明,而不是干擾實際做計算/睡眠的工作。

最佳,

陰影

附:我所引用的文章是由我撰寫的,但似乎傳達了它可能與某些配置選項有關的想法,這似乎是而不是就是這種情況。這就是爲什麼我在這裏寫這篇文章,基本上要求一種方法來繞過這樣一個問題,不管它的起源。

+0

我發現,當請求的PHP腳本實際上「返回」一些信息時,可以防止「超時」,例如,通過回聲(「。」)。當然,只有當人們能夠反覆回覆某些東西,而這些迴歸時刻之間的時間短於900秒時,這才起作用。當然,這會混淆AJAX請求的responseText,因此它可用作解決方法,但不一定是最佳解決方案。 – Shadow

回答

0

我從你提到的其他職位!

現在,我對你想要做的事情有更多的瞭解:監視一個可能長時間運行的服務器工作,我可以推薦一些應該更好的東西,它不是直接回答你的問題,而是它的設計考慮其本質上包括更合適的解決方案。

基本上,將「啓動」服務器端任務的動作與監視其進度斷開連接。

  • 執行。php在服務器上啓動你的後臺作業,並立即返回。
  • 另一個腳本/ URL(讓我們稱之爲status.php)可用來檢查execute.php正在執行的任務的進度。
    • 當status.php被請求時,它將不會返回,直到它有東西要報告爲止,除非30秒(或其他一些固定的)時間流逝,此時它返回一個值,你知道的意思是「檢查再次」。在循環中執行此操作,並可以在後臺任務完成時立即收到通知。類似這種做法

更多細節:http://billhiggins.us/blog/2011/04/27/resty-long-ops

我希望這有助於給你一些設計理念,以解決您的問題!