美文网首页PHP知识
laravel 队列的使用

laravel 队列的使用

作者: _不能说的秘密i | 来源:发表于2018-08-30 13:02 被阅读9次

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
  • 执行数据库迁移, 执行后会在数据库中创建 jobsfailed_jobs 两个数据表

2.编写任务类

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

相关文章

网友评论

    本文标题:laravel 队列的使用

    本文链接:https://www.haomeiwen.com/subject/nqbrwftx.html