浅析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中常用编辑器推荐
Jan 02 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
php三维数组去重(示例代码)
Nov 26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
PHP常见字符串操作函数与用法总结
Mar 04 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代码
2006/12/06 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
python各种excel写入方式的速度对比
2020/11/10 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
html5服务器推送_动力节点Java学院整理
2017/07/12 HTML / CSS
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
业务部经理岗位职责
2014/01/04 职场文书
公务员转正考察材料
2014/02/07 职场文书
财务部总监岗位职责
2014/03/12 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
食品药品安全责任书
2015/05/11 职场文书
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技