Laravel中使用Queue的最基本操作教程


Posted in PHP onDecember 27, 2017

前言

laravel中的队列服务跟其他队列服务也没有什么不同,都是最符合人类思维的最简单最普遍的流程:有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息,将达到执行要求的任务执行并删除。由于PHP是url驱动的同步语言,本身是阻塞的,所以laravel提供一个守护进程工具来查询并执行队列信息也就不足为奇了。

这两天初次接触 Laravel 的队列,也是搞了好一会。。。一番折腾下来还是感慨对 Laravel 不得其门,文档写的相对简单和概括,看源码又有些力不从心(不过看源码慢慢调试验证还是最可靠的)。

下面是我的一个简单 Demo,仅仅使用了队列的最基本操作,偏高级的操作需要再去好好时间一番 :)

和我一样入门 Laravel 的队列有些困难的同学可以交流一下。

配置

添加 Redis 包

在 composer.json 中 require 部分加入 "predis/predis": "~1.0",,然后 composer up 更新一下即可。

database.php

在 database.php 配置文件中对 redis 数据库部分进行配置,默认有一个 default 连接,就用这个好了:)

根据这个默认连接中需要的配置项,编辑 .env 配置文件,将其中的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填写成自己服务器中 Redis 的相应值。

queue.php

首先需要去 .env 中配置 QUEUE_DRIVER,因为现在打算用 Redis,所以配置成 redis。

接着配置 queue.php 里 connections 部分的 redis 连接,其中 connection 对应的值就是 database.php 中 redis 的那个 default 连接。

任务类

接下来就是写实际的操作类了,Laravel 提供了 artisan 命令简化创建任务类:

php artisan make:job Demo

在 app 目录下会生成 Jobs 目录,里面已经有了 Demo.php 任务类。

Lumen 可没有这个 artisan 命令,不过也很方便,默认会有一个 ExampleJob.php 已经写好了,拷贝一份改个名字即可。
先写个简单的日志输出测试一下好了,在 handle 方法中:

Log::info('Hello, queue');

发放任务

现在写个入口函数,推送任务到队列中。使用辅助函数 dispatch():

Laravel 中使用如下方式:

Demo::dispatch();

Lumen 中使用如下方式:

dispatch(new Demo);

开启队列

顺利的话,这是最后一步了。命令行中执行:

php artisan queue:listen --queue=default

它会监听队列,并输出简单的执行情况,比如:

[2017-11-07 02:12:47] Processing: App\Jobs\Demo
[2017-11-07 02:12:47] Processed: App\Jobs\Demo

没啥问题后就可以让这个队列脚本执行在后台:

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

进阶一下 :)

推送到队列中时,一般会有传参的需求,那这里怎么传呢?

参数传递

传入

在入口函数中传入参数方式如下:

Laravel 中使用如下方式:

$param = 'Stephen';
Demo::dispatch($param);

Lumen 中使用如下方式:

$param = 'Stephen';
dispatch(new Demo($param));

接收

在任务类中接收参数方式如下:

protected $param;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($param)
{
  $this->param = $param;
}
/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
  Log::info('Hello, ' . $this->param);
}

初次尝试到此为止,还有许多高级用法,比如延迟分发、错误处理、优先级、失败处理等,后续会继续写 :)

多队列

这是一个必然需要考虑到的问题,我不可能将所有任务都放在一个叫 default 的队列中,这样不容易对队列进行管理。

要指定不同的队列,非常简单,在 dispatch() 后紧接着跟上 onQueue() 方法即可:

Demo::dispatch()->onQueue('emails');

不对啊,我好像没有定义过这个叫 emails 的 queue。嗯,自然需要做出一点改动,在 queue.php 配置文件中的 redis 配置 queue 从 default 改为 {default},这样做的效果就是队列的名称可以从运行的时候动态拿到,而不是写死的。

如果使用 Lumen 框架,那么直接这么写会报错:Call to a member function onQueue() on string。

原因在于 Lumen 的 Job 基类中并没有使用 Illuminate\Foundation\Bus\Dispatchable 这个 trait,而是直接使用 Illuminate\Bus\Queueable 中的 onQueue() 方法。

那么现在就很清楚了,我们的 Job 类使用了 Illuminate\Bus\Queueable 这个 trait,所以需要在 Job 类上调用这个 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));

当我们在开启队列的时候:

php artisan queue:work --queue=emails

这里指定的队列名 emails 和 dispatch 时指定的队列名保持一致即可。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考链接

Laravel 官方文档

PHP 相关文章推荐
以文本方式上传二进制文件的PHP程序
Oct 09 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
JpGraph php柱状图使用介绍
Aug 23 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
PHP查询网站的PR值
Oct 30 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
Oct 23 PHP
php获取系统变量方法小结
May 29 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
php微信开发之谷歌测距
Jun 14 PHP
php获取ajax的headers方法与内容实例
Dec 27 #PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 #PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 #PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 #PHP
php-msf源码详解
Dec 25 #PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 #PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 #PHP
You might like
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
php 保留字列表
2012/10/04 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
使用Vue构建可重用的分页组件
2018/03/26 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
SQLite3中文编码 Python的实现
2017/01/11 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
python数值基础知识浅析
2019/11/19 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
python实现感知机模型的示例
2020/09/30 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
12岁生日感言
2014/01/21 职场文书
九年级科学教学反思
2014/01/29 职场文书
环保公益广告语
2014/03/13 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
辞职书格式样本
2015/02/26 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技