PHP学习笔记LaravelLaravel开发实践

Laravel框架学习笔记之异步队列

2018-08-13  本文已影响160人  赵客缦胡缨v吴钩霜雪明

当我们在使用laravel框架开发Web项目时,有时会需要异步操作。

Laravel队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、BeanstalkdAmazon SQSRedis以及同步(本地使用)驱动。其中还包含了一个 null 队列驱动用于那些放弃队列的任务。

在配置文件 config/queue.php 有一个 connections 配置项。该配置项定义了后台队列服务的特定连接,如 Amazon SQS, Beanstalk, 或 Redis。每种队列连接都可以有很多队列,可以想象在银行办理现金业务的各个窗口队列。

queue 配置文件中的每个连接配置示例都有一个 queue 属性。当新的队列任务被添加到指定的连接时,该配置项的值就是默认监听的队列(名称)。

// 以下的任务将被委派到默认队列...

dispatch(new Job);

// 以下任务将被委派到 "emails" 队列...

dispatch((new Job)->onQueue('emails'));

Laravel 的队列进程支持通过优先级指定处理的队列。可以将高优先级的任务委派到high(高优先级)队列,从而让它优先执行。

示例 php artisan queue:work --queue=high,default

我们常用的队列驱动有两个:数据库和Redis

1.数据库。要使用 database 队列驱动,需要数据表(jobs)保存任务信息

2.Redis。要使用 redis 队列驱动,需要在配置文件 config/database.php 中配置 Redis 数据库连接。

一.创建异步任务

因为该任务使用了 SerializesModels trait,Eloquent 模型将会在任务被执行时优雅地序列化和反序列化。如果你的队列任务在构造函数中接收Eloquent 模型,只有模型的主键会被序列化到队列,当任务真正被执行的时候,队列系统会自动从数据库中获取整个模型实例。这对应用而言是完全透明的,从而避免序列化整个 Eloquent 模型实例引起的问题。handle 方法在任务被处理的时候调用。

二.分发任务

创建好任务类后,就可以通过辅助函数 dispatch 将其分发到队列。

三.运行队列进程

Laravel 包含了一个队列进程用来处理被推送到队列的新任务。使用 queue:work 命令运行队列进程。请注意,队列进程开始运行后,会持续监听队列,直至你手动停止或关闭终端:

php artisan queue:work

指定最大失败次数/超时时间

最大失败次数

指定队列任务最大失败次数的一种实现方式是通过 Artisan 命令 --tries 切换:

php artisan queue:work --tries=3

超时

类似的,队列任务最大运行时长(秒)可以通过 Artisan 命令 --timeout 来指定:

php artisan queue:work --timeout=30

进行休眠时间

当任务在队列中有效时,进程会持续处理任务,没有延迟。不过,我们可以使用 sleep 配置项来指定没有新的有效任务产生时的休眠时间:

php artisan queue:work --sleep=3

配置Supervisor

当项目部署到linux 服务器上时,我们需要使用Supervisor来保证异步队列进程的正常运行。Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。

安装好Supervisor之后,Supervisor 配置文件通常存放在 /etc/supervisor/conf.d 目录,可以创建多个配置文件指示 Supervisor 监视进程。例如,创建一个开启并监视queue:work 进程的 laravel-worker.conf 文件:

启动Supervisor

创建配置文件成功后,需要刷新 Supervisor 的配置信息并使用如下命令启动进程:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

这样,异步队列任务就可以持续运行了。

处理失败的任务

不可避免会出现失败的任务。Laravel 设置任务允许的最大尝试次数,若是执行次数达到该限定,任务会被插入到 failed_jobs 表。

运行队列进程时,通过 --tries 参数项来设置队列任务允许的最大尝试次数,如果没有指定 --tries 选项的值,任务会被无限期重试:

php artisan queue:work redis --tries=3

重试失败的任务

要查看已插入到 failed_jobs 数据表中的所有失败任务,可以使用 Artisan 命 :

php artisan queue:failed

该命令将会列出任务ID,连接,队列和失败时间,任务ID可用于重试失败任务。

例如,要重试一个ID为5的失败任务,要用到下面的命令

php artisan queue:retry 5

要重试所有失败任务,使用如下命令即可:

php artisan queue:retry all

如果你要删除一个失败任务,可以使用queue:forget命令:

php artisan queue:forget 5

要删除所有失败任务,可以使用queue:flush命令

php artisan queue:flush

上一篇下一篇

猜你喜欢

热点阅读