JTimer 介绍
基于thinkPHP5_layui秒级定时任务管理
jtimer使用了master-worker进程模型,能够实现无阻塞执行任务。
时间表达使用了cron表达式,可精确到秒级,方便好用(比crontab多一位)
安装与使用
项目要求:
1. PHP.ini开放exec方法
2. 安装pcntl扩展
3. 安装posix扩展
后台部署
项目后台基于thinkPHP5+layui实现,部署方法参考thinkPHP5官方文档,此处不再阐述。
任务进程管理
所有命令均在项目根目录下执行
启动进程:
PHP think jtimer start
停止进程:
PHP think jtimer stop
查看进程状态:
PHP think jtimer status 或 ps aux | grep jtimer
架构介绍
cron表达式
* * * * * * | | | | | | | | | | | ---- 星期(0-6) | | | | ------ 月份(1-12) | | | -------- 日 (1-31) | | ---------- 时 (0-23) | ------------ 分 (0-59) |------------- 秒 (0-59)
进程模型
简单来说,就是两个worker进程,1个负责数据的读写(读任务,写日志),1个负责任务的执行(创建task进程执行任务)。
Q1: 为什么要用两个worker,而不是一个worker直接读数据库然后执行任务?
为了让任务不阻塞,执行每一个任务时都会创建一个新的task进程去执行,task进程执行完毕会退出。如果在worker进程使用了数据库连接,那么fork出来的task进程会继承worker进程的连接(共用一个数据库连接),在task进程退出后,worker和task共用的连接也将被关闭,导致worker断开数据库连接。
Q2:cron任务定时执行是如何实现的?
先解析任务的cron表达式得到该任务下次要执行的具体时间,然后将该任务置于时间轮片(TimingWheel)中,worker进程每秒查看一次时间轮片,发现有要执行的任务就取出来执行。执行完毕后再重复执行上面的步骤。(关于TimingWheel,请自行百度)
演示
注意
本项目只在测试环境运行过,如果要用于生产环境,请自行进行严格的测试后再投入使用。如有问题,自行负责。
JTimer 官网
https://gitee.com/itzhoujun/JTimer
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。