ThinkAdmin v5.0 增加自定异步任务机制

邹景立
 邹景立
发布于 2019年08月14日
收藏 20

ThinkAdmin v5.0 增加自定义任务机制,不再依赖于 think-queue 组件。

去除数据表  system_jobs 和 system_jobs_log,增加 system_queue 表。

关于异步任务处理指令如下:

  • 执行 php think xtask:listen 启动异步任务监听守护主进程
  • 执行 php think xtask:query 查询正在执行的所有任务进程
  • 执行 php think xtask:start 创建异步任务监听守护主进程
  • 执行 php think xtask:state 查看异步任务监听主进程状态
  • 执行 php think xtask:stop 平滑停止异步任务所有的进程

admin/sys.php 函数增加 sysqueue 函数以方便增加 任务队列。

sysqueue($title, $loade, $later = 0, $data = [], $double = 1)

可以指定任务的标题,执行任务,延时时间,任务附加数据,允许创建重复任务等。

有些任务,在待处理和处理中是不需要再创建重复任务的,$double 就需要设置为0,这是根据标题来识别的,所以标题也可以适当加上个性名称。

自建的异步处理是多进程任务处理,其中 windows 是基于 wmic 指令创建进程实现的,而 linux 则是通过 & 符实现。

因为是异步并列执行,建议自行控制下任务数据,免得过多消耗系统资源而影响项目正常使用。

在部署时,通常我们只需要创建定时器去执行 php think xtask:start 就可以守护异步任务监听进程。

目前,ThinkAmdin V5 自定义异步任务机制支持两种规则机制。

一、自定义单独的处理类,需要继承 app\admin\queue\Queue 抽象类,实现 execute 方法,参数为  $input, $output, $data 
其中 input 为 cli 输入对象,output 为 cli 输出对象,而 data 为任务绑定的数据。详情可以阅读:https://gitee.com/zoujingli/ThinkAdmin/blob/master/application/wechat/queue/WechatQueue.php

二、自定义 ThinkPHP 指定,默认使用 Console::call() 去尝试执行传入的指令。如:

sysqueue("同步[{$this->appid}]粉丝列表",'xfans:all', 0, ['appid' => $this->appid], 0);

关于ThinkAdmin更多用法,请移步 https://gitee.com/zoujingli/ThinkAdmin

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:ThinkAdmin v5.0 增加自定异步任务机制
加载中

最新评论(19

高久峰是个大胖子
大佬 请问我投递一个任务 然后windows下面就会新创建一个cli的终端在执行,投递多个就会有多个cli终端,请问有办法默认最小化或者隐藏吗?
水木易安
水木易安
我来晚了
小塔罗
小塔罗
😝你这个队列跟我们公司现在使用的实现方式很想
一位极其不愿意透漏姓名的马先生
一位极其不愿意透漏姓名的马先生
说真的不如go来得省事,内部自己维护时间轴,crontab,不停的给数据库增加压力
邹景立
邹景立
不会,crontab 不会联数据库
邹景立
邹景立
定时任务只是负责检查进程是否存在,进程若不在了就创建一个监听进程。
高久峰是个大胖子
感谢大佬,在windows下原来是使用pclose+popen+wmic process call create实现不阻塞的php执行,学到了。谢谢。但是不理解为什么用 $_ = ('.' ^ '^') . ('^' ^ '1') . ('.' ^ '^') . ('^' ^ ';') . ('0' ^ '^'); 位运算符来做,直接pclose不可以吗
邹景立
邹景立
很多平台会对php代表进行安全检查,直接上可执行function会报安全问题,所以这里没有用明文。
游侠小陆
laravel经验不用redis处理你会慢的一笔
邹景立
邹景立
使用 redis 确实会快些,不过环境要求高了很多。
平衡性能成本,使用 mysql 相差也不大,这里环境只需要 mysql+php 就可以正常运行项目。
耗时主要在两个方面:
1、循环查询数据表,找出需要执行的任务;
2、创建任务进程的花费时间。
由于这里采用了多任务并列运行(主进程+多子进程),处理速度还是不错的。
高久峰是个大胖子
能守护运行吗?执行后退出服务器终端还能跑?
邹景立
邹景立
是支持的,可以使用 nohup 执行这个 php think xtask:listen ,或者使用定时任务去检测并执行。
邹景立
邹景立
这里建议使用 crontab 定时执行 php think xtask:start 实现 php think xtask:listen 这个进程运行状态的检查与创建。
linux 环境定时任务创建任务是使用 & 符在后台运行,退出登录也没有关系的,大不了再创建一个主进程。另外也可以使用其它的进程守护工具去执行任务监听。
高久峰是个大胖子
事实上在Linux下面直接用 &符 执行 脱离终端会退出执行,建议这款用php多进程扩展来做,那样就可以脱离终端执行且不依赖于nohup
邹景立
邹景立
第一次主进程退出了,定时任务还会再创建的,之后就不会退出了。一般只配置定时任务,不需要第一次手动创建主进程的!
邹景立
邹景立
不考虑php扩展的原因主要原因是安装扩展麻烦,对php运行环境增加了额外要求,不利于运维!
子弹兄
子弹兄
返回顶部
顶部