• Laravel 队列服务为各种不同的后台队列提供了统一的 API
  • 允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高 web 请求速度

1. 迁移队列需要的数据表;

  • 配置文件:config/queue.php
    • 支持的驱动:“sync”, “database”, “beanstalkd”, “sqs”, “redis”, “null” 。默认使用 sync 驱动
    • 演示时使用 database 驱动,进入 .env 文件修改 QUEUE_CONNECTION=database
# 进入项目目录中 
cd /data/project/test/laravel1

# 创建迁移数据表
php artisan queue:table
# 返回: Migration created successfully!
# 在 database/migrations/ 下创建了迁移文件 2019_08_18_084707_create_jobs_table.php

# 执行迁移
php artisan migrate
# 返回:
Migrating: 2019_08_18_084707_create_jobs_table
Migrated:  2019_08_18_084707_create_jobs_table

2. 编写任务类;

  • 命令行创建一个任务类
php artisan make:job SendEmail
# 返回: Job created successfully.
  • 修改 app/jobs/SendEmail.php
<?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->mail);
        });
    }
}

3. 推送任务到队列中;

  • routes/web.php 新建一条路由
Route::any('queue', 'StudentController@queue');
  • 修改 App/Http/Controllers/StudentController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use App\Student;
use App\Jobs\SendEmail;		// 引入
use Mail;

class StudentController extends Controller{

	// 队列
    public function queue(){
        dispatch(new SendEmail('xxxxxxxxx@.qq.com'));
    }

}
  • 访问:http://192.168.1.214:2000/queue ,再查看数据库,jobs 表多了一条记录,也就是一个队列。任务已经推送到队列中
    在这里插入图片描述

4. 运行队列监听器;

php artisan queue:listen --tries=3
# 返回如下,即为成功
[2019-08-18 13:35:06][281] Processing: App\Jobs\SendEmail
[2019-08-18 13:35:08][281] Processed:  App\Jobs\SendEmail

5. 处理失败任务。

# 建立失败表迁移文件
php artisan queue:failed-table
# 返回: Migration created successfully!
# 在 database/migrations/ 下创建了迁移文件 2019_08_19_075340_create_failed_jobs_table.php

# 执行迁移
php artisan migrate
# 返回:
Migrating: 2019_08_19_075340_create_failed_jobs_table
Migrated:  2019_08_19_075340_create_failed_jobs_table

# 查看失败队列
php artisan queue:failed

# 重新执行指定的失败队列
php artisan queue:retry 1

# 重新执行所有的失败队列
php artisan queue:retry all

# 删除指定的失败队列
php artisan queue:forget 1

# 删除所有的失败队列
php artisan queue:flush
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐