浅析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 相关文章推荐
PHP的历史和优缺点
Oct 09 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
php cli配置文件问题分析
Oct 15 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
php parse_str() 函数的定义和用法
May 23 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
js一组验证函数
2008/12/20 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Python实现115网盘自动下载的方法
2014/09/30 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
Ref与out有什么不同
2012/11/24 面试题
顶岗实习接收函
2014/01/09 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
党建目标管理责任书
2014/07/25 职场文书
党的群众路线调研报告
2014/11/03 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers