这两天第一次接触Laravel的队列已经有一段时间了。..折腾了好久,还是觉得Laravel上手不了。文档比较简单笼统,看源码有点力不从心(不过看源码慢慢调试验证才是最靠谱的)。下面是我的一个简单的demo,只用到了队列最基本的操作,更高级的操作需要花费大量的时间:)像我一样Laravel的队列入门有难度的同学可以交流。配置并添加Redis包。将"predis/predis":"~1.0",添加到composer.json的require部分,然后更新composerup。database.php在database.php配置文件中配置redis数据库部分。默认有个默认连接,用这个就可以了:)根据这个默认连接需要的配置项,编辑.env配置文件,在里面设置REDIS_HOST,REDIS_PASSWORD,REDIS_PORT填写自己服务器Redis对应的值.queue.php首先需要在.env中配置QUEUE_DRIVER,因为现在要使用Redis,所以配置为redis。然后在queue.php的connections部分配置redis连接,其中connection对应的值为database.php中redis的默认连接。下一个任务类是编写实际的操作类。Laravel提供了artisan命令来简化任务类的创建:phpartisanmake:jobDemo会在app目录下生成一个Jobs目录,里面已经有一个Demo.php任务类。lumen没有这个artisan命令,但是也很方便。默认会有一个已经写好的ExampleJob.php,复制一份改个名字就可以了。先写一个简单的日志输出测试,在handle方法中:Log::info('Hello,queue');发布任务现在写一个入口函数,将任务推送到队列中。使用辅助函数dispatch():Laravel使用如下方法:Demo::dispatch();Lumen使用以下方法:dispatch(newDemo);如果成功打开队列,这是最后一步。在命令行执行:phpartisanqueue:listen--queue=default会监听队列并输出简单的执行条件,如:[2017-11-0702:12:47]Processing:App\Jobs\Demo[2017-11-0702:12:47]已处理:App\Jobs\Demo没问题后可以在后台执行这个队列脚本:phpartisanqueue:work--daemon--quiet--queue=default1>>/dev/null2>&1&Advanced:)推送到队列的时候,一般都是需要传参数的,那么这里怎么传呢?参数传递在入口函数中传递参数的方法如下:Laravel使用如下方法:$param='Stephen';演示::调度($param);Lumen使用以下方法:$param='Stephen';调度(新演示($param));任务类中接收参数的方法如下:protected$param;/***创建一个新的job实例。**@returnvoid*/publicfunction__construct($param){$this->param=$param;}/***执行作业。**@returnvoid*/publicfunctionhandle(){Log::info('Hello,'.$this->param);}先试试到目前为止,还有很多高级用法,比如延迟分发,错误处理,优先级,故障处理等等,以后还会继续写:)多队列是必须要考虑的问题。我不可能把所有的任务都放在一个叫default的队列里,这个队列不好管理。指定不同的队列很简单,只需要在dispatch()之后的onQueue()方法中:Demo::dispatch()->onQueue('emails');不,我似乎没有定义这个调用电子邮件的队列。嗯,做一点改变是很自然的。queue.php配置文件中的redis配置队列由default改为{default}。这样做的效果是队列的名称可以从运行时动态获取,而不是硬编码。如果使用Lumen框架,直接这样写会报错:CalltoamemberfunctiononQueue()onstring。原因是Lumen的Job基类没有使用Illuminate\Foundation\Bus\Dispatchabletrait,而是直接使用了Illuminate\Bus\Queueable中的onQueue()方法。所以现在很清楚我们的Job类使用了Illuminate\Bus\Queueabletrait,所以我们需要在Job类上调用这个onQueue()方法。$job=newXXXJob();dispatch($job->onQueue('queue-name'));当我们在开启队列的时候:phpartisanqueue:work--queue=emails此处指定的队列名称emails和dispatch指定的队列名称要一致。参考链接Laravel官方文档
