Laravel消息队列

作者: 啃先生 | 来源:发表于2015-05-15 14:35 被阅读2532次

    Laravel消息队列##

    本文所讲的消息队列是基于Beanstalkd的,一些繁重的任务可以放到消息队列里,后台异步处理。
    看完并实践本系列文章,您便可以搭起来一个多层服务架构,比起直连DB,并发能力要提升许多

    前端 <--> Redis Cache <--> 消息队列 <--> DB
    

    一、设置##

    1.修改配置文件里config/queue.php

    设置default为`beanstalkd`,然后设置connections的beanstalkd,beanstalkd是安装在同一服务器,那么可使用默认的设置
    
    1. 修改环境变量 .env

      QUEUE_DRIVER设置为beanstalkd

      官方文档里没有说一步骤,使得任务一直以同步的方式运行,切记配置它

    2. 使用composer安装pda/pheanstalk ~3.0扩展,怎么安装前文已经有所介绍

    二、安装beanstalkd##

    sudo yum install beanstalkd
    

    安装beanstalkd

    sudo service beanstalkd start
    

    启动

    三、创建命令##

    创建命令,由它执行任务(如数据库操作或图片处理等等)。

    cd到你的工程目录下,运行如下命令,生成一个命令

    php artisan make:command TestQueueToEchoMsg --queued
    

    artisan会在你的Commands目录里生成TestQueueToEchoMsg类,里面包含handle方法,你的任务即在这里执行。

    这里我只测试任务是否可以如期地被执行,于是只是简单地打个log即可,handle方法如下

    public function handle()
        {
            Log::info('at '.time().' log by queue and the msg is:'.$this->msg);
        }
    

    四、coding##

    • router.php添加如下代码

      Route::get('toQueue/{msg}', 'QueueController@triggerQueue');
      
    • QueueController里添加如下代码

      public function triggerQueue( $msg ){
          Log::info('ready to trigger2');
          
      
          $this->dispatch(new TestQueueToEchoMsg($msg)); //commond bus的方式运行,测试成功
      
          // $date = Carbon::now()->addSeconds(15);
          // // $date = Carbon::now()->addMinutes(15);
          // Queue::later($date, new TestQueueToEchoMsg($msg)); //延迟执行任务,测试成功
          
          // Queue::push( new TestQueueToEchoMsg($msg));  //立即执行任务,测试成功
          
          Log::info('triggered');
          echo "trgiered2";
      }
      
      

    五、监听队列##

    执行如下命令,监听队列,当有新的任务时,程序会监听到并执行它。

    php artisan queue:listen
    

    六、让队列跑起来!##

    现在你可以在浏览器中输入http://host/toQueue/hello,然后打开storage/logs/今日的log文件,可以看到日志已经打上,并且是异步的。

    相关文章

      网友评论

        本文标题:Laravel消息队列

        本文链接:https://www.haomeiwen.com/subject/rrfkqttx.html