2010-05-11 132 views
0

我有一個每日抓取10個用戶的日常cron作業,並且與他們做了一堆事情。每天有1000名用戶參與該流程。我不希望cron作業重疊,因爲它們在服務器負載上很重。他們從各種API調用東西,所以我有超時和緩慢的數據提取來應付。限制運行PHP腳本的cron作業的數量

我試過使用一個標記來標記一個cron作業正在運行,但它不夠可靠,因爲一些PHP腳本可能會以各種方式超時或失敗。

有沒有一種很好的方法來阻止多次調用PHP腳本的cron作業,或者控制被調用的次數,因此只有3個實例是例如?

如果可能的話,我寧願在PHP的解決方案。

此刻我將標誌存儲爲數據庫中的值,是否使用鎖定類型文件更好,因爲在這裏https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution

回答

3

我使用了一種骯髒的方式來跟蹤通過數據庫中的表執行的腳本數量。啓動的腳本將插入一行,其中包含id和字段started_time。在退出時,它刪除了他的行。太舊的行被認爲是「失敗\死腳本」。

工作腳本不直接由cron啓動。 Cron每隔1秒左右發佈一次「啓動腳本」,它會檢查表格中活動工作人員的數量,並在需要時產生更多工作人員。

這樣的計劃已經爲我工作了2.5年。只是抓住一些不斷更新的內容。

+0

我一直在尋找跟蹤pid的。我現在還在儲存開始時間,所以如果它適合你,我會試試看,謝謝! – ed209 2010-05-11 18:56:11

1

我有一個類似的問題,並最終編寫我自己的小守護程序,因爲它似乎是最簡單的解決方案。

0

如果您有命令行訪問來從shell運行腳本,我傾向於編寫一個腳本,如我在How feasible is a daemon written in PHP, using ignore_user abort and set_time_limit(0)中描述的那樣 - 以及鏈接到的博客文章。在那個答案中,我描述了一個處理數據的長時間運行的PHP腳本。如果/當它退出時,包裝的bash腳本會重新啓動它,以便它可以完成其工作。

當PHP腳本已經決定,它已經完成了所有的這一天的工作,它計算多少秒,直到它需要再次運行,然後只需調用sleep($howLongToWaitTillRunAgain);

0

你可以用肥胖控制器反覆運行一個腳本。與CRON不同的是,只要一個實例結束,它就可以再次運行腳本的另一個實例。

您還可以從腳本提供反饋,目前沒有其他任何操作,並且在再次運行腳本之前,胖控制器會休眠一段時間。

如果你覺得真的很冒險,你甚至可以讓胖控制器並行運行多個腳本實例,如果隊列真的滿了,但這不是你想要的。

www.4pmp.com/fatcontroller/