当我们在使用laravel框架开发Web项目时,有时会需要异步操作。
Laravel队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、Beanstalkd、Amazon SQS、Redis以及同步(本地使用)驱动。其中还包含了一个 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