• 售前

  • 售后

热门帖子
入门百科

Laravel 队列使用的实现

[复制链接]
不忘初心xrl 显示全部楼层 发表于 2021-10-26 14:07:11 |阅读模式 打印 上一主题 下一主题
1 环境

Laravel是一种类似ThinkPHP的php框架,封装的诸多功能可以很方便的使用。队列Queue便是此中之一。

Windows环境下,可使用PHPstorm作为Laravel的集成开发环境IDE。

2 队列

Laravel可配置多种队列驱动,包括 "sync", "database", "beanstalkd", "sqs", "redis", "null"(具体参见app/config/queue.php)
此中sync为同步,database为使用数据库,背面三种为第三方队列服务,最后一种为不使用队列。

通过在 .env 中的 QUEUE_CONNECTION 选项,来决定选择何种驱动。

如 QUEUE_CONNECTION=database 即为选择数据库驱动队列。

3 原理

所谓队列,会有数据的生产者和消费者之分。生产者向队列中投递数据,消费者从队列中获取数据。

好比向用户发送邮件的场景:如今有10w封邮件需要发送,最简单的,我们需要有一个方法将邮件的收件人、内容等,拆分成10w条使命放在队列中,同时需要设置一个回调方法负责处理惩罚每条使命。当队列中有邮件发送使命时,队列会主动调用回调方法,并转达使命详情进去。回调方法处理惩罚完成后,单条邮件即发送完毕。其他邮件依样处理惩罚。

4 使用数据库驱动队列

4.1 生成使命表

在终端下输入
  1. php artisan queue:table
  2. php artisan migrate
复制代码
在数据库连接正常的环境下,会在数据库中出现jobs表:
  1. [id] bigint
  2. [queue] nvarchar(255)
  3. [payload] nvarchar(max)
  4. [attempts] tinyint
  5. [reserved_at] int
  6. [available_at] int
  7. [created_at] int
复制代码
4.2 创建使命类
  1. php artisan make:job SendEmail
复制代码
在终端内实行上述下令,会主动生成 app/Jobs/SendMail.php 文件
  1. class SendMail implements ShouldQueue
复制代码
在该文件的handle方法中,可以放置使命处理惩罚逻辑。

4.3 发送使命

在任意位置,均可像下面一样调用 dispatch 发送使命
  1. SendMail::dispatch($email);
复制代码
4.4 驱动队列

完成上述步调后,可以在数据库中发现一条记录(导出为insert SQL语句):

复制代码 代码如下:INSERT INTO [jobs]([id], [queue], [payload], [attempts], [reserved_at], [available_at], [created_at]) VALUES (6, N'default', N'{"displayName":"App\\Jobs\\ProcessPodcast","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\ProcessPodcast","command":"O:23:\"App\\Jobs\\ProcessPodcast\":8:{s:29:\"\u0000App\\Jobs\\ProcessPodcast\u0000data\";s:6:\"111222\";s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:7:\"chained\";a:0:{}}"}}', 0, NULL, 1545980176, 1545980176);
此时使命已经放置在数据库内,只有将队列运行起来后,队列才能主动调用回调方法。
  1. php artisan queue:work
复制代码
在终端内运行上述下令即可。该下令还有诸多参数,如deamon、tries等,可根据需要指定。

4.5 守卫历程

为了包管应用服务的稳固性,需要开启守卫历程。

Linux下,一样寻常使用 Supervisor ,Windows下使用 Forever
4.6 实行失败的处理惩罚

对于处理惩罚失败的使命,Laravel也提供的办理方案。通过运行如下下令,即可创建表以记录失败使命。
  1. php artisan queue:failed-table
  2. php artisan migrate
复制代码
在数据库中即生成 failed_jobs :
  1. [id] bigint
  2. [connection] nvarchar(max)
  3. [queue] nvarchar(max)
  4. [payload] nvarchar(max)
  5. [exception] nvarchar(max)
  6. [failed_at] datetime
复制代码
导致使命失败的 Exception 会被转到达 SendMail 的 failed 方法,因而你需要在SendMail中自行实现该方法,并做进一步处理惩罚。

使命实行失败的原因有很多,如传参错误、尝试次数超过限定、超时、乃至在 handle 方法中抛出非常,均会作为失败使命处理惩罚。

4.7 使命实行前后的处理惩罚

Laravel提供了使命实行前后的处理惩罚入口,即在 App/Providers/AppServiceProvider 中的 boot() 中加入如下代码:
  1. public function boot()
  2. {
  3.    Queue::before( function (JobProcessing $event) {
  4.      Log::info("处理任务前");
  5.    });
  6.    Queue::after( function (JobProcessed $event) {
  7.      Log::info("处理任务后");
  8.    });
  9. }
复制代码
转达的 $event 中,带有使命详情,几个简单的例子:
  1. $event->connectionName
  2. $event->job
  3. $event->job->payload()
复制代码
5 使用 Redis 驱动队列

5.1 Laravel 安装 Predis 包

在 Laravel 中使用 Redis 之前,需要通过 Composer 安装 predis/predis 包:
  1. composer require predis/predis
复制代码
上述拓展是资助Laravel与Redis打交道的,我们如今还缺少Redis服务。

假如此时将 .env 中的 QUEUE_CONNECTION 改为 redis,访问时会报错:
  1. Predis \ Connection \ ConnectionException (10061)
  2. ����Ŀ����������ܾ����޷����ӡ� [tcp://127.0.0.1:6379]
复制代码
5.2 配置 Redis 服务

在Redis官网 下载源码后自行编译即可。

官方并未提供Windows版,Redis的Windows版式由微软工作组维护的,你可以从其GitHub页 找到。不外貌似已经不再维护了,最新的版本是16年发布的3.2.100。

Linux下通过简单的运行
  1. ./redis-server
复制代码
即可开启服务,再通过
  1. ./redis-cli
复制代码
来尝试使用Redis。使用也很简单,就是 set key value 和 get key。
Windows下安装后,在下令行中 cd 到安装目次
  1. C:\Program Files\Redis>redis-server redis.windows.conf
  2. C:\Program Files\Redis>netstat -an|find "6379"
  3. TCP  127.0.0.1:6379     0.0.0.0:0       LISTENING
复制代码
即可开启Redis服务。

Redis服务的制止是通过如下下令:
  1. C:\Program Files\Redis>redis-server --service-stop
复制代码
以上就是本文的全部内容,盼望对各人的学习有所资助,也盼望各人多多支持脚本之家。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作