JTimer秒級定時任務管理
基于thinkphp5_layui秒級定時任務管理
jtimer使用了master-worker進程模型,能夠實現(xiàn)無阻塞執(zhí)行任務。
時間表達使用了cron表達式,可精確到秒級,方便好用(比crontab多一位)
安裝與使用
項目要求:
1. php.ini開放exec方法
2. 安裝pcntl擴展
3. 安裝posix擴展
后臺部署
項目后臺基于thinkphp5+layui實現(xiàn),部署方法參考thinkphp5官方文檔,此處不再闡述。
數(shù)據(jù)庫文件位于項目根目錄 jtimer.sql,請自行導入
默認用戶名密碼:admin/admin
任務進程管理
所有命令均在項目根目錄下執(zhí)行
啟動進程:
php think jtimer start
停止進程:
php think jtimer stop
查看進程狀態(tài):
php think jtimer status 或 ps aux | grep jtimer
架構介紹
cron表達式
* * * * * *
| | | | | |
| | | | | ---- 星期(0-6)
| | | | ------ 月份(1-12)
| | | -------- 日 (1-31)
| | ---------- 時 (0-23)
| ------------ 分 (0-59)
|------------- 秒 (0-59)
進程模型
簡單來說,就是兩個worker進程,1個負責數(shù)據(jù)的讀寫(讀任務,寫日志),1個負責任務的執(zhí)行(創(chuàng)建task進程執(zhí)行任務)。
兩者之間通過tp框架自帶的文件緩存作為溝通的橋梁。
Q1: 為什么要用兩個worker,而不是一個worker直接讀數(shù)據(jù)庫然后執(zhí)行任務?
為了讓任務不阻塞,執(zhí)行每一個任務時都會創(chuàng)建一個新的task進程去執(zhí)行,task進程執(zhí)行完畢會退出。如果在worker進程使用了數(shù)據(jù)庫連接,那么fork出來的task進程會繼承worker進程的連接(共用一個數(shù)據(jù)庫連接),在task進程退出后,worker和task共用的連接也將被關閉,導致worker斷開數(shù)據(jù)庫連接。
Q2:cron任務定時執(zhí)行是如何實現(xiàn)的?
先解析任務的cron表達式得到該任務下次要執(zhí)行的具體時間,然后將該任務置于時間輪片(TimingWheel)中,worker進程每秒查看一次時間輪片,發(fā)現(xiàn)有要執(zhí)行的任務就取出來執(zhí)行。執(zhí)行完畢后再重復執(zhí)行上面的步驟。(關于TimingWheel,請自行百度)
演示
注意
本項目只在測試環(huán)境運行過,如果要用于生產(chǎn)環(huán)境,請自行進行嚴格的測試后再投入使用。如有問題,自行負責。
