easyswoole消息队列

  • 打开redis终端,lpush task_list 1 ,2,3,4,5…新建消息队列
  • 在App/Lib目录下新建process文件夹,新建Consumer.php,代码如下:
<?php
/**
 * Created by PhpStorm.
 * User: Tioncico
 * Date: 2018/10/18 0018
 * Time: 9:43
 */
namespace App\Lib\Process;
use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Process;
use App\Lib\Redis\Redis;
use EasySwoole\EasySwoole\Logger;
class Consumer extends AbstractProcess
{
    private $isRun = false;
    public function run($arg)
    {
        // TODO: Implement run() method.
        /*
         * 举例,消费redis中的队列数据
         * 定时500ms检测有没有任务,有的话就while死循环执行
         */
        $this->addTick(500,function (){
            if(!$this->isRun){
                $this->isRun = true;
                $redis = new \redis();//此处为伪代码,请自己建立连接或者维护redis连接
                while (true){
                    try{
                        $task = Redis::getInstance()->lPop('task_list');
                        if($task){
                            var_dump($task);
                            // do you task
                            Logger::getInstance()->log($this->getProcessName().'---'.$task,Logger::LOG_LEVEL_INFO,'DEBUG');
                        }else{
                            break;
                        }
                    }catch (\Throwable $throwable){
                        break;
                    }
                }
                $this->isRun = false;
            }
            //var_dump($this->getProcessName().' task run check');
        });
    }

    public function onShutDown()
    {
        // TODO: Implement onShutDown() method.
    }

    public function onReceive(string $str, ...$args)
    {
        // TODO: Implement onReceive() method.
    }
}
  • 在App/Lib目录下新建Redis文件夹,新建Redis.php,代码如下:
<?php
/**
 * Created by PhpStorm.
 * User: niuyueyang
 * Date: 2019/7/5
 * Time: 17:07
 */
namespace App\Lib\Redis;
use EasySwoole\Component\Singleton;
use EasySwoole\EasySwoole\Config;

class Redis{
    use Singleton;
    public $redis='';
    private function __construct(){
        if(!extension_loaded('redis')){
            throw new \Exception('redis.so不存在');
        }
        try{
//            $redisConfig=Config::getInstance()->getConf('redis');
//            var_dump($redisConfig);
            $this->redis=new \Redis();
            $result=$this->redis->connect('127.0.0.1',6379,5);
        }catch(\Exception $e){
            throw new \Exception($e->getMessage());
        }
        if($result===false){
            throw new \Exception('redis连接失败');
        }
    }
    public function get($key){
        if(empty($key)){
            return '';
        }
        return $this->redis->get($key);
    }
    public function lPop($key){
        if(empty($key)){
            return '';
        }
        return $this->redis->lPop($key);
    }
    public function lPush($key,$val){
        if(empty($key)){
            return '';
        }
        return $this->redis->lPush($key,$val);
    }
}
  • 在根目录下的EasySwooleEvent.php下找到mainServerCreate方法,添加如下代码:
public static function mainServerCreate(EventRegister $register)
    {
        // TODO: Implement mainServerCreate() method.
        $allNum = 3;
        for ($i = 0 ;$i < $allNum;$i++){
            ServerManager::getInstance()->getSwooleServer()->addProcess((new Consumer("consumer_{$i}"))->getProcess());
        }
    }
  • 添加生产者,在App/HttpController/Api/Index.php添加如下方法:
<?php

namespace App\HttpController\Api;
use App\HttpController\Api\Base;
use App\Lib\Redis\Redis;
/**
 * Class Index
 * @package App\HttpController
 */
class Index extends Base
{
	//获取url参数
    function params(){
        $data=[
          'code'=>0,
          'params'=>$this->request()->getRequestParam()
        ];
        return $this->writeJson(200,$data,'获取成功');
    }
    function getRedis(){
        $redis = \EasySwoole\RedisPool\Redis::getInstance()->pool('redis')::defer();
        $redis->set('name','牛越洋');
        $data = $redis->get('name');
        return $this->writeJson(200,  $data,'ok');
    }
    public function pub(){
        $result=Redis::getInstance()->lPush('task_list',$this->request()->getRequestParam()['f']);
        return $this->writeJson(200,  $result,'ok');
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP Swoole 提供了一个消息队列的扩展,可以用于实现消息的发布/订阅功能,类似于 Beanstalkd。下面是一个简单的示例: 1. 安装 Swoole 扩展: ```bash pecl install swoole ``` 2. 创建一个消息处理类: ```php class MessageHandler { public function handle($message) { // 处理消息的逻辑 // ... } } ``` 3. 创建一个 Swoole 服务: ```php $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $messageHandler = new MessageHandler(); $server->on('WorkerStart', function($serv, $worker_id) use ($messageHandler) { // 创建一个 MessageHandler 实例 }); $server->on('Receive', function($serv, $fd, $from_id, $data) { // 将消息发送到消息队列中 $serv->sendMessage($data); }); $server->on('PipeMessage', function($serv, $src_worker_id, $message) use ($messageHandler) { // 处理消息 $messageHandler->handle($message); }); $server->start(); ``` 4. 启动 Swoole 服务,并发送消息队列中: ```php $client = new Swoole\Client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $client->send('hello world'); $client->close(); ``` 当有消息发送到队列中时,Swoole 会将消息交给 `MessageHandler` 类的 `handle` 方法处理。需要注意的是,Swoole 的消息处理是异步的,不会阻塞主进程的执行。同时,Swoole 提供了 `sendMessage` 方法来发送消息消息队列中,并且支持多个进程处理消息,实现了类似于 Beanstalkd 的订阅发布功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值