2011-11-27 14 views
0

我需要連續運行一些任務。這些任務主要包括從數據庫檢索特定記錄,分析並保存它們。這是一個非平凡的分析,可能需要幾秒鐘(也許超過一分鐘)。 我不知道多久將新的記錄保存在等待分析的數據庫中(還有另一個cronjob)。連續運行PHP cronjob的最佳實踐

我是否應該一次檢索一次一個地調用相同分析函數​​(遞歸)的記錄並嘗試保持cronjob運行直到沒有更多的未分析記錄? 或者我應該在每個cronjob運行中檢索一個固定數量的新記錄並每隔一定的時間就調用cronjob?

+0

怎麼樣數據庫觸發器? –

+0

我需要在PHP上運行一些代碼來執行分析。我不認爲它可以純粹在數據庫上完成。 – Gerardo

+0

您可能想嘗試將您的代碼發佈到http://codereview.stackexchange.com/並查看是否有人可以查看它,並讓您知道可能需要記住的內容。 –

回答

6

作業隊列服務器可以用於這種情況下很好地工作(見ActiveMQMemcacheQ例如,而不是直接將未分析記錄到數據庫中,並將它們發送到處理隊列中。然後你的cron作業可以檢索一些如果一個作業需要這麼長時間才能運行cron作業再次觸發,則下一個作業將運行並抓取隊列中的下一個項目。

就我個人而言,我會讓cron作業檢索一個固定數量的記錄用於處理,只是爲了確保在很長一段時間內,如果新記錄不斷增加並且處理器無法跟上,就不會讓腳本停滯處理。最終它可能會完成所有操作你最終可能會以它會持續很長一段時間。

您可能會考慮創建一個鎖定文件,以便作業可以查找任務處理器是否已在運行。例如,當cron作業開始時,檢查是否存在文件(如processor.lock)(如果存在),如果不存在,則退出,創建文件,處理一些記錄並刪除文件。

希望有所幫助。

1

或者我應該在每個cronjob運行中檢索一個固定數量的新記錄並每隔一定數量的分鐘調用cronjob?

那。你必須首先做一些試驗和錯誤指標來決定最佳的fixed amount

當然,這很大程度上取決於您實際做了什麼,您正在同時運行多少個數據庫密集型cron作業以及您擁有哪種設置。我最近花了一天的時間在一個非常密集的腳本中尋找Heisenbug,它將圖像從db遷移到s3(並在遷移時創建了幾個拇指)。問題在於,由於我們的ORM中存在未記錄的行爲,因此與某些圖像的連接在某些時候丟失了,因爲發佈s3 + thumbs圖像比連接時間限制稍多一些。這是一個醜陋的情況,這可能花費超過一天的時間來確定遞歸做這一切計劃。

即使這意味着在cron執行過程中丟失了一點時間,您仍然可以使用安全方法。

0

而不是使用cron作業,我會使用胖控制器來運行和重複任務。它基本上是一個守護進程,它可以運行任何腳本或應用程序,並在完成後重新啓動它,也可以在運行之間延遲。

您可以另外指定一個超時,以便長時間運行的腳本將停止。這樣你就不需要關心鎖定,長時間運行的進程,錯誤進程等等。這將有助於保持業務邏輯清潔。

有在網站上的更多示例和使用案例:

http://fat-controller.sourceforge.net/