mallabee / queue
Beanstalkd、SQS、Redis 的无框架后台任务队列管理。易于在纯 PHP、Symfony、Laravel、Yii2 项目中使用。基于 illuminate/queue (Laravel 队列)。
Requires
- php: ^7.1
- ext-json: *
- ext-mbstring: *
- nesbot/carbon: ^1.26.3
- psr/container: ^1.0
- psr/log: ^1.0
Requires (Dev)
- ext-pcntl: *
- ext-posix: *
- aws/aws-sdk-php: ^3.0
- illuminate/redis: 5.7.27
- jms/serializer: ^1.13
- league/event: ^2.1
- pda/pheanstalk: ^3.2
- predis/predis: ^1.1
Suggests
- ext-pcntl: Required to use all features of the queue worker.
- ext-posix: Required to use all features of the queue worker.
- aws/aws-sdk-php: Required to use the SQS queue driver (^3.0).
- illuminate/redis: Required to use the Redis queue driver (^5.7).
- jms/serializer: For encoding/decoding jobs from string to object (^1.13).
- league/event: For handling worker events, catching exceptions, interacting with queues, etc (^2.1)..
- pda/pheanstalk: Required to use the Beanstalk queue driver (^3.0).
- predis/predis: Required to use the Redis queue driver (^1.1).
This package is auto-updated.
Last update: 2024-09-22 05:38:26 UTC
README
更新日期:2012年2月21日。
状态:仍然活跃。
依赖(包括)illuminate/queue
版本:5.7.27
是什么?
Beanstalkd、SQS 的无框架后台任务队列管理。易于在纯 PHP、Symfony、Laravel、Yii2 项目中使用。基于 illuminate/queue (Laravel 队列)。
使用多个驱动程序进行后台任务管理,并能够注册自定义驱动程序。
什么是后台任务管理?简单来说,就是将工作卸载到后台任务。了解更多: https://www.slideshare.net/JurianSluiman/queue-your-work
为什么?
我们面临一个需要为 Symfony 侧项目和一个具有无框架方法的纯 PHP 项目进行队列管理的问题。这意味着 - 依赖项数量尽可能少。
当时可用的流行包有
illuminate/queue
(Laravel 框架,如此处所示,问题是依赖项过多[例如:“illuminate/console”、“illuminate/container”、“illuminate/contracts”、“illuminate/database”、“illuminate/events”、“illuminate/filesystem”、“illuminate/pagination”、“illuminate/support”:”5.8.*”])。yiisoft/yii2-queue
(与 Yii 框架绑定)。
由于每个包都有其问题,我们坐下来创建这个库——一个无框架的队列后台任务管理库,可用于纯 PHP 项目。
如何?
ENTER - Mallabee Queue,又称 MQ / MQueue(由 mallabee.com 提供)
通过利用从多个库(如 yiisoft/yii2-queue
、illuminate/queue
)中汲取的队列理解、最佳实践和易用性。
我们对 illuminate/queue
包进行了高度修改,请注意,我们在开发新功能和维护此包时依赖于它。
优点/功能
- 无框架 - 可用于纯 PHP 项目、Symfony、Laravel、Yii、Zend 等。
- 注册自定义驱动程序。
- 当通过容器对作业有效负载进行编码/解码时,允许使用自定义序列化器/反序列化器(如
jms/serializer
),如果没有提供,则使用json_encode
、json_decode
。
使用方法
首先要知道的是,大部分缺失的信息你都可以在 illuminate/queue
文档中找到,因为我们的包非常相似(尽管有一些变化):https://laravel.net.cn/docs/5.7/queues#introduction
开始之前你需要了解什么
- 基本的 PHP 理解。
- 什么是队列管理及后台任务。
- Beanstalkd(更多关于队列的阅读: https://jtreminio.com/blog/queues-working-smart-faster-in-parallel/)。
- Amazon SQS。
- 事件调度器。
- 容器。
- Supervisord。
- 序列化器/反序列化器。
向队列管理器播种工作
首先,创建一个新的队列管理器实例。
use Mallabee\Queue\Core\Manager as Queue; $queue = new Queue; $instance = $queue->configure('beanstalkd', [ 'host' => 'localhost', 'queue' => 'default', ]); // If you like - set last configured instance as global $queue->setAsGlobal();
一旦实例已注册并配置,您可以使用以下方式来播种新作业:
// As an instance... $queue->push('SendEmail', array('message' => $message)); // If setAsGlobal has been called... Queue::push('SendEmail', array('message' => $message));
注册自定义队列处理程序驱动程序
默认情况下 - 我们为您提供了一些流行的队列驱动程序,默认情况下即可使用,包括
- Beanstalkd
- Amazon SQS
- Redis(目前尚未实现,因为需要迁移
illuminate/redis
包)
如果您想创建自己的自定义队列,请遵循以下队列文件夹并创建自定义队列驱动程序。
注意:请确保所有连接器、驱动程序和作业文件都在同一文件夹中
然后当您有了驱动程序,就可以像这样注册和配置它来使用它
use Mallabee\Queue\Core\Manager as Queue; $queue = new Queue; $this->registerDriver('mycustomdriver', new \Drivers\MyCustomDriver\MyCustomDriverConnector()); $instance = $queue->configure('mycustomdriver', [ 'host' => 'localhost', 'queue' => 'default', ]); // If you like - set last configured instance as global $queue->setAsGlobal();
使用队列并通过工作进程处理工作
建议您查看位于 example
文件夹下的示例应用程序,以了解您如何从队列中拉取作业并处理它们。
这里有几个文件夹,我们建议您从 ExampleEasy
开始,以便了解情况,此示例与队列管理进行交互 beanstalkd
。
特性和其用法
InteractsWithQueue(作业特性)
- 允许作业与队列交互 - 删除作业等。
JobUtils(作业特性)
- 轻松填充作业参数。当您想轻松与参数交互时很有用(由于可以决定参数类型)。
传递您的容器、事件调度器、记录器、异常处理程序、序列化程序
容器
我们使用流行的 PSR 容器接口。
容器传递给作业,以便您轻松获取依赖项。
此外,它用于自定义序列化/反序列化作业有效载荷。
目前支持的容器
- PSR compliant:Symfony、Laravel 等。
事件调度器
请注意,我们只使用接口的 listen
和 dispatch
,无需实现其他任何内容。
目前支持的容器
league/event
(通过CommonAdapters
)。
记录器
我们使用流行的 PSR 记录器接口。
在队列实用程序中使用。
目前支持的容器
- PSR compliant。
序列化程序 - 使用自定义序列化程序(编码)/反序列化程序(解码)作业有效载荷
您可以使用自定义序列化程序(如 JMS 序列化程序 jms/serializer
和 Symfony 序列化程序)来序列化/反序列化作业有效载荷。
这允许您更好地控制将注册到队列或作为作业处理时传递的有效载荷的最终对象。
为此,您必须使用具有 job_serializer
键的容器。
序列化程序必须实现 JobSerializerInterface
。
请查看示例以了解实际操作。
注意:反序列化过程比传统的 json_encode
、json_decode
方式慢一些。
目前支持的容器
jms/serializer
(通过CommonAdapters
)。
定义
- Manager/队列管理器(有时称为队列)- 注册驱动程序、连接到队列、将作业推送到队列的管理器。
- Seeder - 创建作业并将其添加到队列的脚本。
- Worker - 从队列中拉取作业并触发相关事件的作业。
- Job - 需要完成的工作。
- 连接 - 队列连接。
- 队列 - 队列。
- Driver/适配器 - 驱动程序是与新队列类型(例如:Beanstalkd、SQS、Redis、数据库)交互的方式。
- Connector - 驱动程序连接器是使队列配置与驱动程序之间建立连接并生成实例的类。
- 事件 - 当发生相关事件时触发事件(例如,作业处理、作业失败)。您可以在它们发生时监听这些事件并与队列交互。
- 队列工具 - 有时司机会有其他司机没有的实现/想法,这里就是放置它们的地方。
后台任务管理的最佳实践
- 为什么不将PHP脚本作为守护进程运行? - PHP不适合长时间的后台进程 - 更多信息: http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html
- 为什么不使用
crontab
来运行工作进程?cron至少每分钟生成一个工作进程。
消息队列和Laravel队列(illuminate/queue
)
MQ和Laravel队列(illuminate/queue
)之间的主要区别
- 文件夹结构。
- 容器可以是null,不是必须的,也没有传递。
QueueManager
和Manager
合并为一个类Manager
。- 存在
QueueUtils
,允许您处理特定的驱动程序/适配器功能/实现。 - 事件调度器不是必须的 - 如果没有使用事件调度器 - 将使用null调度器。
- 我们注册处理程序的方式。
Worker->getNextJob()
- 公共而不是私有,因为您可能只想查看作业。Manager
使用instead of使用Capsule的isDownForMaintenance。Manager
添加了$drivers
属性、registerDefaultDrivers
、registerDriver
和configure
函数。- 使用
ExceptionHandlerInterface
而不是直接使用Symfony的ExceptionHandler
。 - 一般来说 - 接口和null占位符用于不是必须的一切。
- 默认连接。
FailingJob
已合并到Worker
->failJob
。Str
和Arr
辅助类 - 只取需要的函数。- 允许使用自定义序列化/反序列化器进行作业编码/解码。
结构差异
缺少实现
SerializesModels
和SerializesAndRestoresModelIdentifiers
特质 - 它们使用Eloquent
模型,且仅适用于Laravel。
贡献
非常感谢贡献。
在贡献之前,请遵循贡献指南。
这是我们缺少的东西
- 不同队列管理(数据库[不使用Doctrine或其他ORM,使用PDO]等)的驱动程序/适配器。
- 不同事件调度器库的事件调度器适配器。
- 例如:Symfony、Laravel、Slim、Zend、Yii的容器适配器。
- 作业序列化器适配器,例如:JMS Serializer、Symfony Serializer。
- 例如:Symfony、Laravel、Slim、Zend、Yii的捆绑包。
- 文档。
- 测试。
- 确保
illuminate/queue
的所有功能也在这里工作。 - 使用不同的生产场景与库进行战斗测试。
- 移除Carbon的依赖。
- 尚未实际测试
SQS
和Redis
队列。
需要修复
FailingJob
缺失。- 将
redis
添加为默认驱动程序。 - 检查
Queue
中的createObjectPayload
是什么,并检查是否有需要转换的 illuminate 依赖项。