浅析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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
在数据量大(超过10万)的情况下
Jan 15 PHP
Look And Say 序列php实现代码
May 22 PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 PHP
php 购物车完整实现代码
Jun 05 PHP
php简单分页类实现方法
Feb 26 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
mysql limit查询优化分析
2008/11/12 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
return false;和e.preventDefault();的区别
2010/07/11 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vuex入门最详细整理
2020/03/04 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
Python requests模块实例用法
2019/02/11 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
django云端留言板实例详解
2019/07/22 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
升学宴主持词
2014/04/02 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
党建工作经验交流材料
2014/05/25 职场文书
2014年度考核工作总结
2014/12/24 职场文书
工作经验交流材料
2014/12/30 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript