浅析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的加密方式及原理
Jun 14 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
js计算页面刷新的次数
2009/07/20 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
js实现简单的秒表
2020/01/16 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
Python import用法以及与from...import的区别
2015/05/28 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
C#面试常见问题
2013/02/25 面试题
公司行政经理岗位职责
2013/12/24 职场文书
上课睡觉检讨书
2014/01/28 职场文书
校园公益广告语
2014/03/13 职场文书
贷款承诺书范文
2014/05/19 职场文书
基层党员公开承诺书
2014/05/29 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
win10更新失败无限重启解决方法
2022/04/19 数码科技
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers