浅析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 join函数应用
May 04 PHP
PHP漏洞全解(详细介绍)
Nov 13 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
PHP多例模式介绍
Jun 24 PHP
PHP $_FILES中error返回值详解
Jan 30 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
PHP 多任务秒级定时器的实现方法
May 13 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
杏林同学录(四)
2006/10/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
python提取xml里面的链接源码详解
2019/10/15 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
python如何求圆的面积
2020/07/01 Python
Python 中如何写注释
2020/08/28 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
python实现磁盘日志清理的示例
2020/11/05 Python
Python对excel的基本操作方法
2021/02/18 Python
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
Linux机考试题
2015/07/17 面试题
竞聘演讲稿
2014/04/24 职场文书