浅析Laravel5中队列的配置及使用


Posted in PHP onAugust 04, 2016

前言

队列常常用于两种场景,一种是高并发的情况,一种是耗时的操作,可以将任务放到队列中去,消费者从队列取任务执行,当然还有失败的情况如何处理,以及延迟,重试,更复杂的情况还有优先级的实现。

在Laravel 5中使用队列非常简单,并且失败处理,延迟,重试的方法都已经实现,下面简单尝试了一下Laravel的队列服务。

Laravel默认支持以下几种队列服务:sync, database, beanstalkd, sqs, redis,本例使用redis作为队列服务,需先配置好Redis服务。

1.队列服务配置

在配置文件queue.php的connections中已经默认定义了redis的连接:

'redis' => [
 'driver'  => 'redis',
 'connection' => 'default',
 'queue'  => 'default',
 'expire'  => 60,
],

.env环境配置文件中把默认的队列驱动改成redis

QUEUE_DRIVER=redis

为了避免配置缓存的影响,执行以下命令清除并重建配置缓存:

php artisan config:cache

2.新建Queueable Jobs

使用命令:

php artisan make:job MyJob

新建一个名为MyJob的队列处理类,在App/Jobs目录下自动生成一个MyJob.php文件。

浅析Laravel5中队列的配置及使用

MyJob.php需要实现handle方法,用来具体执行队列任务,构造函数可以用来传递需要的参数,handle方法支持依赖注入。

这里handle方法随便写了一个,就是往一个list类型数据结构中存一个key-value数据,测试消费队列的时候有没有起作用,构造函数传两个参数就是keyvalue.

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Redis;

class MyJob extends Job implements ShouldQueue
{
 use InteractsWithQueue, SerializesModels;

 private $key;
 private $value;

 /**
  * Create a new job instance.
  *
  * @return void
  */
 public function __construct($key, $value)
 {
  $this->key = $key;
  $this->value = $value;
 }

 /**
  * Execute the job.
  *
  * @return void
  */
 public function handle()
 {
  Redis::hset('queue.test', $this->key, $this->value);
 }

 public function failed()
 {
  dump('failed');
 }
}

在控制器中使用dispatch方法调用队列,将任务放入队列中,控制器中写个方法如public function test()new MyJob的构造函数传两个随机生成的字符串参数:

$queueId = $this->dispatch(new MyJob('key_'.str_random(4), str_random(10)));
dd($queueId);

配置并访问路由,可以多访问几次,然后到Redis中查看,会发现把队列存入了一个queue::queue:defaultList结构中:

浅析Laravel5中队列的配置及使用

其中value内容如下,这是转换成json格式的,而实际上是经过序列号的字符串:

{
 "job": "Illuminate\\Queue\\CallQueuedHandler@call",
 "data": {
  "command": "O:14:\"App\\Jobs\\MyJob\":6:{s:19:\"\u0000App\\Jobs\\MyJob\u0000key\";i:1;s:21:\"\u0000App\\Jobs\\MyJob\u0000value\";i:2;s:10:\"connection\";N;s:5:\"queue\";N;s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}"
 },
 "id": "EV2bhqUlx0T8pRCVHw1qT0fkP8AQcyI8",
 "attempts": 1
}

这里data参数里包含了队列服务Job的名称,构造函数的参数等信息,消费者执行任务的依据。attempts表示重试的次数,往往执行队列任务失败了会重试,可以设置最多尝试次数。

3.消费队列

这个时候任务只是入了队列,但并没有消费,执行:

php artisan queue:listen

这个命令,Laravel就开始消费队列。

浅析Laravel5中队列的配置及使用

可以看到这几个任务以此被消费,再去Redis看看有没有实现预期要达到的效果,每个任务往一个List类型的结构写入数据。

浅析Laravel5中队列的配置及使用

这证明队列任务消费成功。

总结

本文的内容到这就结束了,当然,还有更多Laravel队列的用法,可以请大家继续参考官方手册。希望本文的内容对大家学习Laravel有所帮助。

PHP 相关文章推荐
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
简单的php购物车代码
Jun 05 PHP
PHP中如何判断exec函数执行成功?
Aug 04 #PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 #PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 #PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 #PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 #PHP
浅析php如何实现App常用的秒发功能
Aug 03 #PHP
php微信开发之带参数二维码的使用
Aug 03 #PHP
You might like
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
理清apply(),call()的区别和关系
2011/08/14 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python图算法实例分析
2016/08/13 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
python 读入多行数据的实例
2018/04/19 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
.NET常见笔试题集
2012/12/01 面试题
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
应届生财务管理求职信
2013/11/06 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
公路绿化方案
2014/05/12 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python