以前每開發一個計劃任務功能均須要在線上操做crontab來新增項,因此想採用PHP來統一管理單個項目中的任務項,
能夠經過創建表[id,name,status,func,timer,last_time,created_at] 來統一存放項目中的計劃任務腳本,經過簡單的配置
能將各計劃任務抽象成簡單的任務類,而後經過crontab中配置的單個入口對其進行統一訪問,從而減小了上線代碼對
線上服務器環境進行修改的麻煩.
而後此處有一些坑,由於任務按功能性質劃分可能有好幾種,好比:
1. 單次執行,馬上結束,同一時刻可運行多個實例
2. 守護進程,同一時刻只能運行一個實例
對 第二種 須要
加鎖 機制,還要防止程序由於出現爆錯,異常等狀況沒有解鎖,致使不能再次啓動此種任務
對於此種任務還須要考慮運行期間若是因其餘需求變動,如何快速方便的終止此任務
猜測 經過 任務id 來實現鎖機制,每次任務執行時均須要申請鎖,每次申請的鎖均有固定的使用配額,此種任務
每批次執行完成後均需消耗一次使用配額,當配額爲0時則須要向系統從新申請鎖.
lock_id: $task_id
lock_{$task_id}_quota: $quota
每次從新申請鎖,均需再次讀取任務配置表中該任務的配置信息
若是申請失敗(-1),則關閉這次執行,等待下次執行. 這樣當想停止此種任務時可採起2種方案:
1. 停止本次,只需將其使用配額設爲-1
2. 徹底禁止,重置本任務的status爲禁用,再重置其使用配額爲-1
任務結束以後,要釋放鎖,若是鎖釋放失敗,須要有一個
無效鎖檢測機制來強制釋放
無效鎖的斷定:
關鍵是 如何肯定 任務實例是不是活着的,鎖配額 < 1 可否認定是無效鎖.會不會出現任務在從新申請鎖的過程當中
被 無效鎖檢測機制給幹掉?
幹掉以後是否有影響?
-------------- 服務器
以上是個人假想,求拍磚 進程