浅析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 常用类整理
Dec 23 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
PHP网络操作函数汇总
May 18 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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/01/20 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
ppk谈JavaScript style属性
2008/10/10 Javascript
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
js实现旋转木马效果
2017/03/17 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python学习之asyncore模块用法实例教程
2014/09/29 Python
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python音频处理用到的操作的示例代码
2017/10/27 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
python:接口间数据传递与调用方法
2018/12/17 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
书香校园活动方案
2014/02/28 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
社保转移委托书范本
2014/10/08 职场文书
党校党性分析材料
2014/12/19 职场文书
医院营销工作计划
2015/01/16 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书