前言
最近在摸鱼的时候发现一个PHP常驻内存多进程任务扩展包:EasyTask: PHP常驻内存多进程任务管理器,支持定时任务(PHP resident memory multi-process task manager, supports timing tasks) (gitee.com),支持php使用多线程处理任务。之前我也写过使用workman开启多线程处理任务的文章:
Thinkphp+workman+redis实现多进程异步任务处理_tp6 workerman异步-CSDN博客
Laravel+workman+redis实现多进程异步任务处理_laravel workerman-CSDN博客
相比workman和swoole, 用法差不多,但是EasyTask对于windows环境更加友好,开发起来也更加简单灵活。
使用
安装就不多废话了,直接参照官方文档安装即可,没有什么困难。
直接用thinkphp5.1框架写一个 EasyTask 开启多进程消费redis队列的测试栗子看看效果。
-
1.创建队列
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { //新增队列数据 public function addQueue() { $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); for ($i = 0; $i < 10; $i++) { $redis->rPush('test-queue', $i); } echo 'success'; } }
-
2.创建命令行和任务
<?php namespace app\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\Output; class Task extends Command { protected function configure() { //设置名称为task $this->setName('task') //增加一个命令参数 ->addArgument('action', Argument::OPTIONAL, "action") ->addArgument('force', Argument::OPTIONAL, "force"); } protected function execute(Input $input, Output $output) { //获取输入参数 $action = trim($input->getArgument('action')); $force = trim($input->getArgument('force')); // 配置任务 $task = new \EasyTask\Task(); $task->setRunTimePath('./runtime/'); //监听redis队列 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $task->addFunc(function () use ($redis, $task) { echo '进程空闲中...'.PHP_EOL; while (1){ //循环读取redis队列 $data = $redis->lPop('test-queue'); if (empty($data)){ break; } echo '消费队列:' . $data . PHP_EOL; //模拟耗时任务 sleep(5); } }, 'request', 5, 3); // 根据命令执行 if ($action == 'start') { $task->start(); } elseif ($action == 'status') { $task->status(); } elseif ($action == 'stop') { $force = ($force == 'force'); //是否强制停止 $task->stop($force); } else { exit('Command is not exist'); } } }
-
3.在
application/command.php
注册命令行<?php return [ 'app\command\Task', ];
-
4.访问第一步的接口将数据添加到redis队列
php .\public\index.php /index/index/addQueue
-
5.启动任务 EasyTask
php think task start
我这里开启了3个进程,每个进程每隔5秒消费一个队列,效果图如下
使用效果还是不错的