浅析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开发模式(简写版)
Mar 15 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
搭建vue开发环境
2018/07/19 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
python 中的divmod数字处理函数浅析
2017/10/17 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
python判断正负数方式
2020/06/03 Python
python 6行代码制作月历生成器
2020/09/18 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
物业经理求职自我评价
2013/09/22 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书