2011-02-06 69 views
0

我想在用戶提交表單後30分鐘內調用一個函數。我正在使用javascript setTimeOut()函數,但清除頁面刷新或瀏覽器關閉時的計時器。無論瀏覽器是關閉還是刷新,我都想在30分鐘後精確調用該函數。&我也想顯示剩餘時間到30分鐘以及。運行預定作業

我看着Cron作業,但我的理解是,PHP不能直接調用cron作業。

誰能告訴我這將是做到這一點的最好辦法?

+0

這取決於具體情況。它是否需要在瀏覽器或服務器上運行?它需要多少準確度,±1分鐘是否可以接受? – deceze 2011-02-06 05:23:14

+0

±1是可以接受的。我想保持它在後端運行,也許在服務器上運行。我的要求是,一旦提交表格,計劃中不應該有任何停頓。它運行的地方(瀏覽器或服務器)只要繼續運行就沒關係 – ptamzz 2011-02-06 05:39:14

回答

6
  1. at command和相關的atd守護進程可以安排將來在任意時間執行的事情。你可能不得不寫一個專門的PHP腳本傳遞給at。您可以將額外的參數傳遞給它以便知道哪個用戶提交了表單等。當然,這些代碼將在服務器上執行。 PHP代碼會將結果存儲在數據庫(或類似的全局數據存儲)中。
  2. 要顯示留給用戶多少時間,我會將時間存儲在會話或數據庫中。請記住,服務器時間與用戶計算機上的時間不同,因此最好在服務器上執行任何差異計算,而不是在JavaScript中執行。
  3. setTimeout()呼叫仍然可以使用,以保證瀏覽器被重定向到一個頁面(或通過AJAX等加載它)來查看在適當的時間的結果(假定用戶是網站上的事件發生時)。繼續根據會話中的時間,將每頁上的setTimeout()加載到正確的時間。

請記住,步驟#1中的PHP代碼需要時間來執行,因此您可能需要向#3添加一個小延遲以確保結果可用,以及相應的錯誤由於其他原因,處理結果不可用。

+0

+1我會用這個方法去 – 2011-02-06 05:37:06

2

我投了@wuputah方法,並同意它是最好的,但如果你無法訪問他的第一步(共享主機等),那麼你可以設置時間戳在數據庫中,並設置一個cron作業每隔1分鐘運行一次,檢查數據庫是否存在沒有「已處理」標記的「過期」時間...然後對該數據執行過程(並將數據庫條目標記爲「已處理」,以便它不會在下一個週期)。

+---------------------------------------------+ 
| RECORD ID | TIMESTAMP   | PROCESSED | 
+---------------------------------------------+ 
| 1  | 2010-02-06 15:27:10 | yes  | 
| 2  | 2010-02-06 15:47:10 | no  | 
| 3  | 2010-02-06 15:49:10 | no  | 
+---------------------------------------------+