前言
队列系统能够将对时间实时性要求比较低的事物进行延迟处理,这样做至少有这两方面的好处,一是短时间大量同类型逻辑处理同时出现,把它们放到队列中,按照一定的时间延迟,一件一件处理,这样避免服务器资源瞬时被逼到峰值,造成服务器压力过大;二是便于这类事物的跟踪和维护。队列功能合理分配服务器计算资源,让服务器运行更为平稳。
Laravel数据库队列配置
1).env配置连接队列驱动为database
QUEUE_CONNECTION=database
对应
config\mail.php
'default' => env('QUEUE_CONNECTION', 'sync'),
2)创建记录执行任务与失败任务数据库迁移文件
# 创建用于存放需要执行的任务
php artisan queue:table
# 对执行失败的任务需要记录下来
php artisan queue:failed-table
将上边生成的migrate文件生成数据库表,存放生成的队列消息
php artisan migrate
3)生成任务类
# 创建用于处理用户发送邮件的任务逻辑操作
php artisan make:job EmailUserNewPost
处理任务逻辑代码,将操作记录成日志格式
<?php
namespace App\Jobs;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
class EmailUserNewPost implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
//存放用户模型对象信息
public $user;
/**
* Create a new job instance.
*
* @return void
*/
//当任务EmailUserNewPost类被初始化时传入用户的对象信息
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//定义一个不存在的方法去执行-让失败任务存入失败表中
// test();
//将操作记录成日志格式
Log::info('发送邮件给:'.$this->user->name);
}
//任务失败的处理过程回调函数,打印返回错误信息
public function failed(\Exception $exception)
{
//php artisan queue:work --once --tries=3
Log::error('邮件发送失败-'.$this->user->name);
}
}
4)分发任务dispatch
<?php
use App\Jobs\EmailUserNewPost;
use App\User;
Route::get('/', function () {
$users = User::all();
foreach($users as $user){//循环所有用户,向每一位用户发送一封邮件
dispatch(new EmailUserNewPost($user));//dispatch派发任务,
}
dd('Done');
});
5)运行队列处理器
# 执行单一任务
php artisan queue:work --once
# 一直运行直到它被手动停止或终端被关闭
php artisan queue:work
执行路由后插入到任务表里的队列任务,当运行队列处理器时,jobs表里的任务会被处理消失,失败的任务会插入到failed_jobs表中
设置timeout超时80则记录jobs表attempts字段,设置tries尝试5次失败后放入failed_jobs表中
php artisan queue:work --timeout=80 --tries=5
重新执行队列中失败的Jobs、删除Job
摘抄laravel文档:https://learnku.com/docs/laravel/5.8/queues/3923#error-handling
1)重试失败的任务
要想查看所有被放入 failed_jobs 数据表中的任务,你可以使用 Artisan 命令 queue:failed
php artisan queue:failed
queue:failed 命令会列出任务 ID ,队列,以及失败的时间。任务 ID 可能会被用于重试失败的任务。例如,要重试一个任务 ID 为 5 的任务,会将id=5的队列重新放入jobs表中使用如下命令:
php artisan queue:retry 5
要重试所有失败的任务,执行 queue:retry 命令,将 all 作为 ID 传入:
php artisan queue:retry all
如果你想删除一个失败的任务,使用 queue:forget 命令:
php artisan queue:forget 5
要清空所有失败的任务,使用 queue:flush 命令:
php artisan queue:flush