laravel version: 5.4.*
为什么有使用队列?
使用队列可以将某些耗时任务(比如发送邮件)延迟执行从而大幅提升web请求速度
配置
- 队列的配置文件:
/config/queue.php
- laravel 支持多种队列驱动
sync
database
beanstalkd
sqs
redis
- 可以在
.env
文件中配置队列驱动的类型QUEUE_DRIVER=database
默认是sync
队列的基本使用
1.迁移队列的数据表
- 创建迁移文件(队列记录表)
php artisan queue:table
- 创建迁移文件(失败队列记录表)
php artisan queue:failed-table
php artisan migrate
- 执行数据库迁移, 执行后会在数据库中创建
jobs
和failed_jobs
两个数据表
2.编写任务类
- 创建任务类(我这里以发送邮件为例), 如果你还不会用laravel发送邮件请看 https://www.jianshu.com/p/5f4b689b3954
php artisan make:job SendEmail
- 编写任务类
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $email;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($email)
{
$this->email = $email;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Mail::raw('测试队列', function($message) {
$message->to($this->email);
});
}
}
3.推送任务到队列
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Jobs\SendEmail;
use Mail;
class TestController extends Controller{
public function queue(){
// dispatch 的参数是你刚刚创建的任务类 /jobs 目录下的类
dispatch(new SendEmail('3233824562@qq.com'));
}
}
- 因为 Controller 类use了 DispatchesJobs 这个 trait 所以能够直接使用 dispatch 方法
- 如果需要在模型中用
dispatch
方法,请手动use
这个 trait - 在浏览器中访问这个控制器方法, 会发现在
jobs
这个数据表中多了一条记录
4.运行队列监听器
php artisan queue:listen
- 如果执行成功,
jobs
中的数据表就没有数据了 - 如果执行失败,可以在日志中查看原因, 默认是
storage/logs/laravel.log
4.处理失败的任务
在任务失败时, 你可以选择
清除失败的任务
或者重新执行失败的任务
- 查看所有失败的任务, 会将所有失败的任务查询出来输出到命令行
php artisan queue:failed
重新执行失败任务
- 重新执行指定id失败的任务
php artisan queue:retry 1
此处的 1
失败任务表中的任务的 id
, 表示重新执行指定id失败任务
- 重新执行所有的失败任务
php artisan queue:retry all
清除失败任务
- 清除指定id失败的任务
php artisan queue:forget 2
此处的 2
失败任务表中的任务的 id
, 表示清除指定id失败任务
- 清除所有失败的任务
php artisan queue:flush
网友评论