之前每開發一個計畫任務功能都需要在線上操作crontab來新增項目,所以想採用PHP來統一管理單一專案中的任務項目,
可以透過建立表格[id,name,status,func,timer, last_time,created_at] 來統一存放項目中的計劃任務腳本,通過簡單的配置
能將各計劃任務抽象成簡單的任務類,然後通過crontab中配置的單個入口對其進行統一訪問,從而減少了上線程式碼對
線上伺服器環境進行修改的麻煩.
然後此處有一些坑,因為任務按功能性質劃分可能有好幾種,比如:
1. 單次執行,立刻結束1. ,同一時刻可運行多個實例
2. 守護程序,同一時刻只能運行一個實例
對第二種需要 加鎖 機制,還要防止程序因為出現爆錯,異常等情況沒有解鎖,導致無法再次啟動此種任務
對於此種任務還需要考慮運行期間如果因其他需求變更,如何快速方便的終止此任務
猜想透過任務id 來實現鎖定機制,每次任務執行時均鎖定機制需要申請鎖定,每次申請的鎖定均有固定的使用配額,此種任務
每批次執行完成後均需消耗一次使用配額,當配額為0時則需要向系統重新申請鎖定.
lock_id: $task_id
lock_{$task_id}_quota: $quota
每次重新申請鎖定,均需再次讀取任務配置表中該任務的配置資訊),則關閉此次執行,等待下次執行. 這樣當想中止此種任務時可採取2種方案:
1. 中止本次,只需將其使用配額設為-1
2. 完全禁止,重置本任務的status為禁用,再重置其使用配額為-1
任務結束之後,要釋放鎖,如果鎖定釋放失敗,需要有一個 無效鎖定偵測機制來強制釋放
無效鎖的判定:
關鍵是如何確定任務實例是否是活著的,鎖配額
被無效鎖檢測機制給幹掉?
幹掉後是否有影響?