分享一个php常驻内存多进程任务的扩展

前言

最近在摸鱼的时候发现一个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 复制代码
    <?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 复制代码
    <?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 复制代码
    <?php
    return [
        'app\command\Task',
    ];
  • 4.访问第一步的接口将数据添加到redis队列

    bash 复制代码
    php .\public\index.php /index/index/addQueue
  • 5.启动任务 EasyTask

    bash 复制代码
    php think task start

我这里开启了3个进程,每个进程每隔5秒消费一个队列,效果图如下

使用效果还是不错的

相关推荐
荣淘淘4 天前
互联网大厂求职面试记:谢飞机的搞笑答辩
java·jvm·spring·面试·springboot·线程池·多线程
牟同學5 天前
从竞态到原子:pread/pwrite 如何重塑高效文件 I/O?
linux·网络编程·c·多线程
荣淘淘6 天前
互联网大厂Java面试三大回合全解析:从语言特性到性能安全
java·安全·面试·性能优化·互联网·多线程·语言特性
工一木子8 天前
Java多线程基础:进程、线程与线程安全实战
java·多线程
专注VB编程开发20年9 天前
C# .NET支持多线程并发的压缩组件
开发语言·前端·c#·.net·多线程·zip·压缩
羑悻的小杀马特11 天前
【C++高并发内存池篇】ThreadCache 极速引擎:C++ 高并发内存池的纳秒级无锁革命!
开发语言·c++·多线程·高性能内存池
shylyly_15 天前
Linux->多线程2
java·linux·多线程·线程安全·线程同步·线程互斥·可重入
左直拳22 天前
前端vue3+后端spring boot导出数据
超时·多线程·异步·连接超时·数据导出
困鲲鲲22 天前
CPP多线程2:多线程竞争与死锁问题
c++·多线程·死锁
源代码•宸1 个月前
C++高频知识点(十八)
开发语言·c++·经验分享·多线程·互斥锁·三次握手·字节对齐