您好,登录后才能下订单哦!
本篇文章给大家分享的是有关Queue怎么在Laravel中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
配置
添加 Redis 包
在 composer.json 中 require 部分加入 "predis/predis": "~1.0",,然后 composer up 更新一下即可。
database.php
在 database.php 配置文件中对 redis 数据库部分进行配置,默认有一个 default 连接,就用这个好了:)
根据这个默认连接中需要的配置项,编辑 .env 配置文件,将其中的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填写成自己服务器中 Redis 的相应值。
queue.php
首先需要去 .env 中配置 QUEUE_DRIVER,因为现在打算用 Redis,所以配置成 redis。
接着配置 queue.php 里 connections 部分的 redis 连接,其中 connection 对应的值就是 database.php 中 redis 的那个 default 连接。
任务类
接下来就是写实际的操作类了,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
以上就是Queue怎么在Laravel中使用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。