php笔记之-队列

1、简介

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

1.1 配置

.env文件的QUEUE_DRIVER选项决定应用使用的队列“驱动”。(这使用数据库)

.env文件选项 QUEUE_DRIVER=database

1.2 队列驱动预备知识

数据库

为了使用database队列驱动,需要一张数据库表来存放任务,要生成创建该表的迁移,运行Artisan命令queue:table,迁移被创建好了之后,使用migrate命令运行迁移:

php artisan queue:table
php artisan migrate

2、编写任务类

1. 生成任务类

默认情况下,应用的所有队列任务都存放在app/Jobs目录。

php artisan make:job SendReminderEmail

2.1  任务类结构

默认情况下,应用的所有队列任务都存放在app/Jobs目录。任务类非常简单,正常情况下只包含一个当队列处理该任务时被执行的handle方法,让我们看一个任务类的例子:

<?php

namespace App\Jobs;

use App\User;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    protected $user;

    /**
     * 创建一个新的任务实例
     *
     * @param  User  $user
     * @return void
     */
    public function __construct()
    {
        
    }

    /**
     * 执行任务
     *
     * @param  Mailer  $mailer
     * @return void
     */
    public function handle()
    {
           DB::table('comments')->insert(['name'=>'测试任务']);
  }

  

推送任务到队列

1. 控制器中

因为Laravel app/Http/Controllers/Controller.php 使用了DispatchesJobs trait。该trait提供了一些允许你方便推送任务到队列的方法,例如dispatch方法:

// 表示一分钟后执行任务
$job = (new SendJob())->delay(60);
$this->dispatch($job);


Artisan控制台运行如下命令

php artisan queue:listen(测试可以)

或者

php artisan queue:work(官方建议)
 

使用--tries开关来指定任务最大可尝试执行次数

php artisan queue:listen --tries=3

处理失败的任务

任务执行次数达到最大限制后,会被插入到failed_jobs表,失败任务的名字可以通过配置文件config/queue.php来配置。

1. 迁移记录失败队列需要的数据表

php artisan queue:failed-table
php artisan migrate

2. 重试失败任务

要查看已插入到failed_jobs数据表中的所有失败任务,该命令将会列出任务ID,连接,对列和失败时间。

php artisan queue:failed

任务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




posted @ 2017-09-01 15:32  花儿为何那样红  阅读(243)  评论(0编辑  收藏  举报