我需要在動態時間運行腳本(與數據庫中的日期時間一致)。任何想法如何做到這一點?PHP在動態時間運行腳本?爲cron工作還是沒有?
例子:
數據庫明天說在一個時間字段中午1的話,我想在中午運行該腳本的明天。
我需要在動態時間運行腳本(與數據庫中的日期時間一致)。任何想法如何做到這一點?PHP在動態時間運行腳本?爲cron工作還是沒有?
例子:
數據庫明天說在一個時間字段中午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);
}
注意,這是不穩健。強大的腳本會在鎖定時抓取記錄,將其更新爲「處理」狀態,處理它並將其更新爲「完成」狀態。這意味着多個進程可以在同一時間工作(即使偶然),而不是重複的工作。此外,這意味着單一故障不會阻止火車。
是的,我知道這個解決方案。我正在尋找可以更好地擴展的東西。有沒有辦法動態生成一個cronjob?我可以看到運行一個通過db的腳本,並創建一個cron,爲db中的每個結束時間運行一次。這有可能嗎? –
不確定你的意思是「規模」更好......如果你想要一個更好的解決方案,編寫你自己的守護進程總是運行。你可以用'atd'做自動調度,但我不想成爲管理對此的更改的人。通常,更好的方式是讓數據庫成爲整個計劃的主要來源。 – gahooa
除非PHP正在運行,否則PHP不能執行任何操作,所以除非您打算讓腳本無限期地運行(這是不可行的),您需要定期運行一個腳本來檢查是否需要執行某些操作。 – soulkphp
另一種方法可能會有一個腳本,該腳本以reguiar間隔檢查數據庫,一旦它看到一個新的作業,就會爲該腳本創建cron作業。您顯然需要一些方法來確保您的進程在插入到相關crontab後進行更新。
您是否需要按分鐘或按第二個分辨率? – gahooa