浅析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
简单的页面缓冲技术
Oct 09 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
PHP中通过语义URL防止网站被攻击的方法分享
Sep 08 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
php转换颜色为其反色的方法
Apr 27 PHP
PHP处理会话函数大总结
Aug 05 PHP
php关闭warning问题的解决方法
May 17 PHP
php+ajax+json 详解及实例代码
Dec 12 PHP
PHP根据key删除数组中指定的元素
Feb 28 PHP
Laravel使用模型实现like模糊查询的例子
Oct 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
javascript工具库代码
2012/03/29 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Python中用Decorator来简化元编程的教程
2015/04/13 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
python 8种必备的gui库
2020/08/27 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
学雷锋献爱心活动总结
2015/05/11 职场文书
撤诉申请怎么写
2015/05/19 职场文书
创业计划书之宠物店
2019/09/19 职场文书
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android