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 相关文章推荐
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
Dec 06 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
Laravel validate error处理,ajax,json示例
Oct 25 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
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python request中文乱码问题解决方案
2020/09/17 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
标准化管理实施方案
2014/02/25 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
优秀团员事迹材料
2014/12/25 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
感恩教育主题班会
2015/08/12 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
详解vue身份认证管理和租户管理
2021/05/25 Vue.js