olvlvl/delayed-event-dispatcher

v3.0 2019-11-15 14:26 UTC

This package is auto-updated.

Last update: 2024-09-16 02:14:56 UTC


README

Release Build Status Code Quality Code Coverage Packagist

《olvlvl/delayed-event-dispatcher》包提供了一个事件分发器,该分发器将事件分发延迟到应用生命周期中的较晚时间。

延迟事件分发器对于在响应发送后可以完美分派事件时,可以减少您的HTTP应用程序的响应时间。例如,更新需要清除缓存、执行投影或重新索引的实体,这些都与响应本身无关。延迟事件在刷新时分发,但您可以选择完全不同的解决方案,例如使用RabbitMQKafka将它们发送给消费者。

由于您可能使用一个事件分发器为您的应用程序,您不希望所有事件都延迟,其中一些必须立即分派,以便应用程序能够正常运行,这就是为什么您可以指定一个仲裁者来确定哪些事件要延迟,哪些不要。

最后,由于您希望在刷新时将所有延迟事件分派——即使抛出异常——您可以提供一个异常处理程序。您决定做什么。您可能希望恢复,记录异常,然后继续分派其他事件。

免责声明:延迟事件分发器是一个装饰器,旨在与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();

使用自定义刷新器刷新延迟事件

默认情况下,在刷新时使用装饰事件分发器分派事件,但您可以选择完全不同的解决方案,例如使用RabbitMQKafka将它们发送给消费者。

<?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命令运行测试套件。要运行套件,需要全局安装PHPUnitComposer。命令会按需安装依赖。运行make test-coverage命令将运行测试套件,并在build/coverage中创建HTML覆盖率报告。目录可以稍后使用make clean命令清理。

该软件包通过Travis CI持续进行测试。

Build Status Code Coverage

许可证

olvlvl/delayed-event-dispatcher许可协议为新BSD许可证 - 详细信息请参阅LICENSE文件。