easyswoole如何实现Redis队列消费/自定义进程

定义消费进程逻辑

<?php
namespace App\Process;
use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Process;
class Consumer extends AbstractProcess
{
    private $isRun = false;
    public function run($arg)
    {
        /*
         * 举例,消费redis中的队列数据
         * 定时500ms检测有没有任务,有的话就while死循环执行
         */
        $this->addTick(500,function (){
            if(!$this->isRun){
                $this->isRun = true;
                $redis = new \redis();//此处为伪代码,请自己建立连接或者维护redis连接
                while (true){
                    try{
                        $task = $redis->lPop('task_list');
                        if($task){
                            // do you task
                        }else{
                            break;
                        }
                    }catch (\Throwable $throwable){
                        break;
                    }
                }
                $this->isRun = false;
            }
            var_dump($this->getProcessName().' task run check');
        });
    }
    public function onShutDown() { }
    public function onReceive(string $str, ...$args) { }
}

注册消费进程
在EasySwoole的全局事件中,注册消费进程。

<?php
use App\Process\Consumer ;
use EasySwoole\Component\Process\Manager;
use EasySwoole\EasySwoole\Swoole\EventRegister;
public static function mainServerCreate(EventRegister $register)
{
    $allNum = 3; // 注册三个消费进程
    for ($i = 0 ;$i < $allNum;$i++){
        $processConfig= new \EasySwoole\Component\Process\Config();
        $processConfig->setProcessName('ConsumerProcess'.$i);//设置进程名称
        Manager::getInstance()->addProcess(new Consumer ($processConfig));
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容