dotkernel/dot-queue

此包已被废弃,不再维护。未建议替代包。

DotKernel 队列组件

2.0.1 2021-07-08 09:22 UTC

README

OSS Lifecycle GitHub license

DotKernel 队列组件

##注意 dot-queue 已被废弃,将不再进行开发!

要求

  • PHP >= 7.1
  • zendframework/zend-servicemanager
  • zendframework/zend-db (可选 - 如果使用数据库适配器,则安装)

安装

运行以下命令

$ composer require dotkernel/dot-queue

安装所有依赖项后,将 \Dot\Queue\ConfigProvider::class 添加到您的配置聚合中,以便注册所有依赖项和命令行命令。

队列

此包提供了以下队列实现

  • Dot\Queue\Queue\InMemoryQueue - 非持久队列,基于 \SplQueue,主要用于测试目的
  • Dot\Queue\Queue\PersistentQueue - 使用适配器将作业持久化/从存储中检索

队列必须实现 Dot\Queue\Queue\QueueInterface 或扩展 Dot\Queue\Queue\AbstractQueue

队列适配器

队列适配器与 PersistentQueue 协同使用。提供的队列适配器针对所使用的存储特定

  • Dot\Queue\Adapter\DatabaseAdapter - 基于 zend-db,使用 MySql 存储进行作业的入队/出队

队列适配器必须实现 Dot\Queue\Adapter\AdapterInterface

配置队列

目前,该包仅提供了一个数据库适配器,用于与持久队列一起使用。因此,下面的配置模板显示了如何配置 MySQL 队列。

在您的 config/autoload 文件夹中创建一个配置文件,并用合适的内容替换 {{QUEUE_NAME}}

queue.global.php
<?php

return [
    'dot_queue' => [
        'default_queue' => '{{QUEUE_NAME}}',
    
        'failed_job_provider' => [
            // these options are specific to the provider used
            // we give here the database failed job provider options
            'db_adapter' => 'database',
            'table' => 'failed_jobs',
        ],

        'adapter_manager' => [],
        'adapters' => [
            'database' => [
                'type' => \Dot\Queue\Adapter\DatabaseAdapter::class,
                'options' => [
                    // configured zend db service name adapter
                    'db_adapter' => 'database',
                    'table' => 'jobs',
                    'failed_table' => 'failed_jobs'
                ],
                // other adapters...
            ]
        ],

        'queue_manager' => [],
        'queues' => [
            '{{QUEUE_NAME}}' => [
                // this is the default queue type, if not specified
                // 'type' => \Dot\Queue\Queue\PersistentQueue::class,
                'options' => [
                    'adapter' => 'database',
                    // after how many seconds, failed job will be attempted again
                    'retry_after' => 60,
                    // maybe other queue options later
                ]
            ],
            // other queues...
        ]
    ]
];

您可以配置多个适配器和多个队列。多个队列也可以使用相同的队列适配器。

创建作业类

作业表示队列消费时将处理的单位工作。通过扩展 Dot\Queue\Job\AbstractJob 创建作业类。

作业必须声明 2 个方法

  • process() - 当作业由队列处理时将被调用。在这里完成您的任务。
  • failed($e) - 当作业失败(超出最大尝试次数)时被调用。它将接收到导致失败异常
//...
class MyJob extends AbstractJob
{
    public function process()
    {
        //...
    }
    
    public function failed($e)
    {
        //...
    }
}

您还可以向作业类注入所需依赖项。使用工厂类并在服务容器中注册该作业。

队列管理器

Dot\Queue\Queue\QueueManager 是主类,用于在任何地方注入作业到队列。

为了创建和分配作业

$job = $queueManager->createJob(MyJob::class)
    ->setMaxAttempts(3)
    ->setTimeout(30)
    ->setDelay(0)
    ->setPriority(1);
    
// set custom data into the job, that you can access when the job will be processed
$job->set('key1', 'some data')
    ->set('key2', 'some other data');
    
// dispatch the job
$job->dispatch(); //to the default queue OR
$job->dispatch('queue_name');

重要

  • 创建作业时,始终使用队列管理器的 ->createJob(className) 方法。这将确保作业从容器中获取并正确初始化。

  • 为了避免序列化复杂性,我们建议您只将标量或数组数据设置为作业的有效负载。这不应被视为限制,因为您可以注入服务到作业中,稍后可以从数据库检索对象等...

  • 作业已经定义了一些合理的默认值,例如最大尝试次数、超时和其他作业选项。仅覆盖您需要的部分。

消费作业

运行以下dotkernel命令以启动工作循环以消费默认队列

$ php dot queue:consume

有关支持命令选项的详细信息,请运行

$ php dot help queue:consume

有用的消费者选项

  • --all - 以轮询方式消费所有定义的队列
  • --queues= - 要消费的队列的逗号分隔列表
  • --max-runtime= - 仅运行指定秒数的消费者
  • --max-jobs= - 运行消费者直到处理完指定数量的作业(包括失败的作业)
  • --sleep= - 在队列空时暂停队列指定秒数(检查命令的帮助以获取选项的完整列表)

在生产中,我们建议您使用监控软件,例如supervisord,以确保消费者保持运行。在开发期间,您可以使用名为forever的npm包模拟supervisord

数据库迁移

为了为作业表和失败作业表生成迁移文件(用于Phinx库),提供了两个命令

  • $ php dot queue:jobs-table
  • $ php dot queue:failed-table

运行这些命令将生成具有以下默认选项的迁移文件

  • 命名空间将设置为Data\Database\Migrations
  • 表名分别为jobsfailed_jobs
  • 文件生成的路径为data/database/migrations

您可以使用--namespace=--table-name=--path选项分别覆盖这些选项

生成文件后,您可以运行

$ vendor/bin/phinx --configuration=your/config/file migrate

以创建表

处理失败作业

我们提供了一些命令来帮助您管理失败作业

  • php dot queue:failed [--queue=] 列出所有失败作业,或按队列名称过滤
  • php dot queue:flush [--queue=] 移除所有失败作业,可选地按队列名称过滤
  • php dot queue:forget <uuid> 从失败作业列表中删除指定ID的作业
  • php dot queue:retry [<uuid>] [--queue] 将作业重新调度回其队列以进行重试。如果没有提供ID,则重试所有失败作业或按队列过滤

@TODO - 队列事件