olvlvl / delayed-event-dispatcher
延迟事件分发
Requires
- php: >=7.2
- psr/event-dispatcher: ^1.0
README
《olvlvl/delayed-event-dispatcher》包提供了一个事件分发器,该分发器将事件分发延迟到应用生命周期中的较晚时间。
延迟事件分发器对于在响应发送后可以完美分派事件时,可以减少您的HTTP应用程序的响应时间。例如,更新需要清除缓存、执行投影或重新索引的实体,这些都与响应本身无关。延迟事件在刷新时分发,但您可以选择完全不同的解决方案,例如使用RabbitMQ或Kafka将它们发送给消费者。
由于您可能使用一个事件分发器为您的应用程序,您不希望所有事件都延迟,其中一些必须立即分派,以便应用程序能够正常运行,这就是为什么您可以指定一个仲裁者来确定哪些事件要延迟,哪些不要。
最后,由于您希望在刷新时将所有延迟事件分派——即使抛出异常——您可以提供一个异常处理程序。您决定做什么。您可能希望恢复,记录异常,然后继续分派其他事件。
免责声明:延迟事件分发器是一个装饰器,旨在与psr/event-dispatcher一起使用。
实例化延迟事件分发器
延迟事件分发器是一个装饰器,这意味着您需要另一个事件分发器来装饰。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $delayedEventDispatcher = new DelayedEventDispatcher($eventDispatcher);
实例化一个非活动延迟事件分发器
默认情况下,延迟事件分发器是活动的,这意味着它将延迟事件。这对于您的HTTP应用程序来说很好,但您不希望控制台或消费者应用程序有这种情况。您可以通过将disabled
选项定义为true
来创建一个禁用的延迟事件分发器。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $disabledDelayedEventDispatcher = new DelayedEventDispatcher($eventDispatcher, true);
当您的HTTP/控制台/消费者应用程序使用相同的工件部署时,这特别有用,您可以使用环境变量来自定义它。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $disabledDelayedEventDispatcher = new DelayedEventDispatcher( $eventDispatcher, filter_var(getenv('MYAPP_DISABLE_DELAYED_EVENT_DISPATCHER'), FILTER_VALIDATE_BOOLEAN) );
刷新延迟事件
延迟事件通过flush()
方法刷新(分派)。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var DelayedEventDispatcher $delayedEventDispatcher */ $delayedEventDispatcher->dispatch($event1); $delayedEventDispatcher->dispatch($event2); $delayedEventDispatcher->flush();
使用自定义刷新器刷新延迟事件
默认情况下,在刷新时使用装饰事件分发器分派事件,但您可以选择完全不同的解决方案,例如使用RabbitMQ或Kafka将它们发送给消费者。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var \PhpAmqpLib\Channel\AMQPChannel $channel */ /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $messagingDelayedEventDispatcher = new DelayedEventDispatcher( $eventDispatcher, true, null, null, function (object $event) use ($channel) { $channel->basic_publish(json_encode($event), 'my_exchange', $event->getName()); } );
决定延迟哪些事件和不延迟哪些事件
默认情况下,所有事件都延迟(如果延迟事件分发器是通过disabled = false
创建的)——但您可以提供一个仲裁者来选择要延迟的事件和不要延迟的事件。您可以使用Delayable
接口来标记您的事件,但这不是必需的。仲裁者是一个简单的可调用对象,其实现取决于您。
<?php use olvlvl\DelayedEventDispatcher\Delayable; use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; $arbiter = function (object $event) { return $event instanceof Delayable; }; /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $disabledDelayedEventDispatcher = new DelayedEventDispatcher($eventDispatcher, false, $arbiter);
处理异常
默认情况下,在事件分派期间抛出的异常不会被恢复,分派会停止,导致延迟事件留在队列中。如果您想从这些异常中恢复,并确保所有事件都被分派,您将需要提供一个异常处理程序。
<?php use olvlvl\DelayedEventDispatcher\DelayedEventDispatcher; /* @var \Psr\Log\LoggerInterface $logger */ $exceptionHandler = function (\Throwable $error, object $event) use ($logger) { // The exception is recovered, we log it to fix it later $logger->danger($error); }; /* @var \Psr\EventDispatcher\EventDispatcherInterface $eventDispatcher */ $disabledDelayedEventDispatcher = new DelayedEventDispatcher($eventDispatcher, false, null, $exceptionHandler);
要求
该包需要PHP 7.2或更高版本。
安装
推荐通过Composer来安装此软件包
$ composer require olvlvl/delayed-event-dispatcher
克隆仓库
该软件包可在GitHub上找到,可以使用以下命令行克隆其仓库
$ git clone https://github.com/olvlvl/delayed-event-dispatcher.git
文档
您可以使用make doc
命令生成软件包及其依赖的文档。文档生成在build/docs
目录中。ApiGen是必需的。目录可以稍后使用make clean
命令清理。
测试
使用make test
命令运行测试套件。要运行套件,需要全局安装PHPUnit和Composer。命令会按需安装依赖。运行make test-coverage
命令将运行测试套件,并在build/coverage
中创建HTML覆盖率报告。目录可以稍后使用make clean
命令清理。
该软件包通过Travis CI持续进行测试。
许可证
olvlvl/delayed-event-dispatcher许可协议为新BSD许可证 - 详细信息请参阅LICENSE文件。