dotkernel / dot-queue
DotKernel 队列组件
Requires
- php: ^7.1
- dotkernel/dot-console: ^0.1.0
- phplucidframe/console-table: ^1.2
- psr/log: ^1.0
- ramsey/uuid: ^3.7
- zendframework/zend-filter: ^2.7
- zendframework/zend-servicemanager: ^3.3
- zendframework/zend-validator: ^2.10
Requires (Dev)
- phpunit/phpunit: ^4.8
- squizlabs/php_codesniffer: ^2.3
- zendframework/zend-db: ^2.8
This package is auto-updated.
Last update: 2021-07-08 09:26:49 UTC
README
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
- 表名分别为
jobs
和failed_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,则重试所有失败作业或按队列过滤