队列


1、简介

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

1.1 配置

队列配置选项位于.env文件。

1.2 队列驱动预备知识

数据库

要使用database作为队列驱动,需要一张数据库表来存放任务:

Schema::create('jobs', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('queue');
    $table->longText('payload');
    $table->tinyInteger('attempts')->unsigned();
    $table->tinyInteger('reserved')->unsigned();
    $table->unsignedInteger('reserved_at')->nullable();
    $table->unsignedInteger('available_at');
    $table->unsignedInteger('created_at');
    $table->index(['queue', 'reserved', 'reserved_at']);
});
其它队列依赖

下面是以上列出队列驱动需要安装的依赖:

  • Amazon SQS: aws/aws-sdk-php ~3.0
  • Beanstalkd: pda/pheanstalk ~3.0
  • Redis: predis/predis ~1.0

2、和Laravel的不同之处

和框架许多其它功能一样,Lumen的队列任务方法依赖于Laravel队列任务,因此,要了解Lumen队列任务的更多细节,可查看完整的Laravel队列文档。
但是,Lumen和Laravel的队列实现也有少许不同支持,下面我们就来讨论这些区别。首先我们来看队列任务的生成。

2.1 生成器

Lumen并没有内置自动创建新的任务类,取而代之的,你需要拷贝框架内置的ExampleJob类,这个类提供了每个队列任务都共享的基本类结构,ExampleJob继承的基类Job已经包含了InteractsWithQueueQueueableSerializesModels这些trait:

<?php

namespace App\Jobs;

class ExampleJob extends Job{
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
    }
}

2.2 分发任务

再次重申,关于分发队列任务的完整信息请参考Laravel队列文档,和Laravel框架一样,你可以使用dispatch方法从Lumen应用的任何地方分发任务:

dispatch(new ExampleJob);

当然,你还可以使用Queue门面,如果你选择使用这个门面,需要取消文件bootstrap/app.php$app->withFacades()前面的注释:

Queue::push(new ExampleJob);