这两天初次接触 Laravel 的队列,也是搞了好一会。。。一番折腾下来仍是感慨对 Laravel 不得其门,文档写的相对简单和归纳,看源码又有些力不从心(不过看源码慢慢调试验证仍是最可靠的)。php
下面是个人一个简单 Demo,仅仅使用了队列的最基本操做,偏高级的操做须要再去好好时间一番 :)laravel
和我同样入门 Laravel 的队列有些困难的同窗能够交流一下。redis
在 composer.json
中 require
部分加入 "predis/predis": "~1.0",
,而后 composer up
更新一下便可。数据库
在 database.php
配置文件中对 redis 数据库部分进行配置,默认有一个 default 链接,就用这个好了:)json
根据这个默认链接中须要的配置项,编辑 .env
配置文件,将其中的 REDIS_HOST
、REDIS_PASSWORD
、REDIS_PORT
填写成本身服务器中 Redis 的相应值。服务器
首先须要去 .env
中配置 QUEUE_DRIVER
,由于如今打算用 Redis,因此配置成 redis
。app
接着配置 queue.php
里 connections 部分的 redis 链接,其中 connection
对应的值就是 database.php
中 redis 的那个 default 链接。composer
接下来就是写实际的操做类了,Laravel 提供了 artisan 命令简化建立任务类:框架
php artisan make:job Demo
在 app
目录下会生成 Jobs
目录,里面已经有了 Demo.php
任务类。函数
Lumen 可没有这个 artisan 命令,不过也很方便,默认会有一个 ExampleJob.php 已经写好了,拷贝一份改个名字便可。
先写个简单的日志输出测试一下好了,在 handle
方法中:
Log::info('Hello, queue');
如今写个入口函数,推送任务到队列中。使用辅助函数 dispatch()
:
Laravel 中使用以下方式:
Demo::dispatch();
Lumen 中使用以下方式:
dispatch(new Demo);
顺利的话,这是最后一步了。命令行中执行:
php artisan queue:listen --queue=default
它会监听队列,并输出简单的执行状况,好比:
[2017-11-07 02:12:47] Processing: App\Jobs\Demo [2017-11-07 02:12:47] Processed: App\Jobs\Demo
没啥问题后就可让这个队列脚本执行在后台:
php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1 &
进阶一下 :)
推送到队列中时,通常会有传参的需求,那这里怎么传呢?
在入口函数中传入参数方式以下:
Laravel 中使用以下方式:
$param = 'Stephen'; Demo::dispatch($param);
Lumen 中使用以下方式:
$param = 'Stephen'; dispatch(new Demo($param));
在任务类中接收参数方式以下:
protected $param; /** * Create a new job instance. * * @return void */ public function __construct($param) { $this->param = $param; } /** * Execute the job. * * @return void */ public function handle() { Log::info('Hello, ' . $this->param); }
初次尝试到此为止,还有许多高级用法,好比延迟分发、错误处理、优先级、失败处理等,后续会继续写 :)
这是一个必然须要考虑到的问题,我不可能将全部任务都放在一个叫 default
的队列中,这样不容易对队列进行管理。
要指定不一样的队列,很是简单,在 dispatch()
后紧接着跟上 onQueue()
方法便可:
Demo::dispatch()->onQueue('emails');
不对啊,我好像没有定义过这个叫 emails 的 queue。嗯,天然须要作出一点改动,在 queue.php
配置文件中的 redis
配置 queue
从 default
改成 {default}
,这样作的效果就是队列的名称能够从运行的时候动态拿到,而不是写死的。
若是使用 Lumen 框架,那么直接这么写会报错:Call to a member function onQueue() on string
。
缘由在于 Lumen 的 Job 基类中并无使用 Illuminate\Foundation\Bus\Dispatchable
这个 trait
,而是直接使用 Illuminate\Bus\Queueable
中的 onQueue()
方法。
那么如今就很清楚了,咱们的 Job 类使用了 Illuminate\Bus\Queueable
这个 trait
,因此须要在 Job 类上调用这个 onQueue()
方法。
$job = new XXXJob(); dispatch($job->onQueue('queue-name'));
当咱们在开启队列的时候:
php artisan queue:work --queue=emails
这里指定的队列名 emails 和 dispatch
时指定的队列名保持一致便可。