2011-08-28 64 views

回答

1

一個非常簡單的方法是每1分鐘有一個cron-job調用一個PHP腳本,並讓它檢查需要完成的事情的數據庫。如果需要完成NOW(),則執行該操作並從數據庫中刪除。

您需要考慮像鎖定,進程堆棧,多個進程等等,以使其健壯。但是如果你的需求很簡單,這是一個簡單的方法來使它工作。

一下添加到crontab中:

* * * * * /usr/bin/php /path/to/my/script.php 

而且在/path/to/my/script.php

<?php 
$ts = time(); 

// Run for up to 50 seconds 
while($ts + 50 > time()) 
{ 
    ... SELECT id, job_stuff FROM JobTable WHERE JobDate <= NOW() ... 

    process job 

    ... DELETE job_stuff FROM JobTable WHERE id = ... 

    sleep(5);  
} 

注意,這是不穩健。強大的腳本會在鎖定時抓取記錄,將其更新爲「處理」狀態,處理它並將其更新爲「完成」狀態。這意味着多個進程可以在同一時間工作(即使偶然),而不是重複的工作。此外,這意味着單一故障不會阻止火車。

+0

是的,我知道這個解決方案。我正在尋找可以更好地擴展的東西。有沒有辦法動態生成一個cronjob?我可以看到運行一個通過db的腳本,並創建一個cron,爲db中的每個結束時間運行一次。這有可能嗎? –

+0

不確定你的意思是「規模」更好......如果你想要一個更好的解決方案,編寫你自己的守護進程總是運行。你可以用'atd'做自動調度,但我不想成爲管理對此的更改的人。通常,更好的方式是讓數據庫成爲整個計劃的主要來源。 – gahooa

+0

除非PHP正在運行,否則PHP不能執行任何操作,所以除非您打算讓腳本無限期地運行(這是不可行的),您需要定期運行一個腳本來檢查是否需要執行某些操作。 – soulkphp

0

另一種方法可能會有一個腳本,該腳本以reguiar間隔檢查數據庫,一旦它看到一個新的作業,就會爲該腳本創建cron作業。您顯然需要一些方法來確保您的進程在插入到相關crontab後進行更新。