JTimer 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
JTimer 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
JTimer 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 Apache 2.0
开发语言 PHP
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 君君要上天哈
适用人群 未知
收录时间 2018-04-03

软件简介

 基于thinkphp5_layui秒级定时任务管理

jtimer使用了master-worker进程模型,能够实现无阻塞执行任务。

时间表达使用了cron表达式,可精确到秒级,方便好用(比crontab多一位)

安装与使用

项目要求:


1. php.ini开放exec方法
2. 安装pcntl扩展
3. 安装posix扩展

后台部署

项目后台基于thinkphp5+layui实现,部署方法参考thinkphp5官方文档,此处不再阐述。

数据库文件位于项目根目录 jtimer.sql,请自行导入

默认用户名密码:admin/admin


任务进程管理


所有命令均在项目根目录下执行

启动进程:


 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进程执行任务)。

两者之间通过tp框架自带的文件缓存作为沟通的桥梁。

Q1: 为什么要用两个worker,而不是一个worker直接读数据库然后执行任务?

为了让任务不阻塞,执行每一个任务时都会创建一个新的task进程去执行,task进程执行完毕会退出。如果在worker进程使用了数据库连接,那么fork出来的task进程会继承worker进程的连接(共用一个数据库连接),在task进程退出后,worker和task共用的连接也将被关闭,导致worker断开数据库连接。

Q2:cron任务定时执行是如何实现的?

先解析任务的cron表达式得到该任务下次要执行的具体时间,然后将该任务置于时间轮片(TimingWheel)中,worker进程每秒查看一次时间轮片,发现有要执行的任务就取出来执行。执行完毕后再重复执行上面的步骤。(关于TimingWheel,请自行百度)

演示

注意


本项目只在测试环境运行过,如果要用于生产环境,请自行进行严格的测试后再投入使用。如有问题,自行负责。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击加入讨论🔥(5) 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
5 评论
46 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部