IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP & 理解 Laravel 中 Jobs & Queue (任务队列)的作用、使用 -> 正文阅读

[PHP知识库]PHP & 理解 Laravel 中 Jobs & Queue (任务队列)的作用、使用

一、介绍

1.2 什么是任务

现实中每件事都可以当做一个任务,而在业务中,比如
发送邮箱就是一个任务,
推送通知就是一个任务,
定时删除 log 也是一个任务,
你甚至可以说输出一个hello,world 也是一个任务。

1.2 什么是队列

队列这词听起来很抽象,但其实它的构成就是把所有任务放到一个容器里面就叫做队列
[任务1, 任务2, 任务3]
它的执行顺序是任务1、任务2、任务3、即FIFO (先进先出) 模式。

二、任务队列有什么用

作用

  1. 解决阻塞问题:当某个任务执行时间耗费很久时且响应结果不受影响时,我们可以提前响应结果避免用户等太久,然后我们在把这个任务丢到队列里面交给后台执行。这其中就是用到了异步执行概念
  2. 解决并发和一致性问题:比如秒杀活动,有100个用户同时点击,那么我们就把这100个任务放队列里面,然后逐个执行,如果有坐高铁的伙伴购票时也经常会看到[正在派排队中…] 这个页面,其实正是利用了这种任务队列机制。

场景:

用户注册成功后,发送邮箱通知祝贺一下。
用户提交订单成功后,手机短信通知一下。

三、怎么用任务队列

有了任务队列后,在 Laravel 中要怎么定义和执行这些任务呢?
比如我有这以下的任务队列
[发送邮箱任务, 推送通知任务, 手机通知短信任务, 定时删除log任务, 推送通知任务, ....]

别急,接下来我会逐步讲解,为了简化,这里只演示两个任务:发送邮箱、发送手机短信

  1. 第一步肯定是要创建任务啦
php artisan make:job SendEmailJob
php artisan make:job SendMessageJob

此命令会在 App\Jobs\下生成 SendEmailJob.phpSendMessageJob.php 文件。
这俩文件我们只需关心里面的 handle 方法,执行任务时会自动触发,handle 代码如下

// SendEmailJob.php ==================================
public function handle() {
    // 作为演示,简单打印下。
    echo "Start to send email. \n";
}

// SendMessageJob.php ==================================
public function handle() {
	echo "Start to end message. \n";
}
  1. 有了任务后自然要选择存放任务容器即队列,也就是存储[发送邮箱任务, 发送短信任务] ,Laravel 提供了 redis、database、sync、等队列容器供我们存储,默认是 database ,表示将这些任务放到数据库里面。
php artisan queue:table
php artisan migrate

命令1 会自动在 App/database/migrations/ 下创建2022_02_26_082602_create_jobs_table.php 文件。
命令2 是根据 migrations 里的所有文件生成对应的表,所以自然包含了上面的 jobs 表。
最后还要在 .env 里面将 QUEUE_CONNECTION 设置为 database

  1. 现在任务和队列容器都创好了,我们来定义两个路由,分别是注册和提交订单
// route/web.php =====================
use App\Jobs\SendEmailJob;
use App\Jobs\SendMessageJob;
Route::get('/register', function() {
	// 触发任务,即将任务加入队列里。
	dispatch(SendEmailJob::class);
	return "注册成功";
});

Route::get('/submit', function(){
	dispatch(SendMessageJob::class);
	return "提交成功";
});

现在我们来访问下 http://localhost:8000/register 和 http://localhost:8000/submit 页,打印如下:
在这里插入图片描述
在这里插入图片描述
细心的你应该发现了哪里不对劲,那两个任务好像没看到触发啊?
是的,它确实没触发,但是它已经进入队列容器了,也就是已经存放到 jobs 表里面了,不信我们来访问下 jobs 表。
在这里插入图片描述
可以明显看到,jobs 表有两条记录,那两条记录肯定就是我们的任务了,现在只是差最后一步,执行那些任务!

  1. 打开新窗口,输入如下命令开始执行队列。
php artisan queue:work

此命令会一直运行着,一旦有任务就会去执行,如果你的项目部署在 linux 系统,可以写个 .sh 运行此命令,现在我们来看下输出:
在这里插入图片描述
执行任务完成!
现在我们再来看看那个 jobs 表的那两条记录是不是也没了。
在这里插入图片描述
好了,关于任务队列的使用就到这里。

总结

任务:每个功能都可称呼为一个任务。
队列:存储任务,是一种类似数组[任务1, 任务2, ...]的存储结构,它使用的存储容器有 database、redis、等。

参考文献:
https://www.phpclasses.org/blog/post/332-How-to-Use-Queue-To-Speedup-PHP-Processing-Tasks-Part-1-Queueing-Slow-Tasks.html

https://appdividend.com/2017/12/21/laravel-queues-tutorial-example-scratch/

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:48:22  更:2022-03-03 15:49:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:36:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码