fervo/deferred-event-bundle

将事件延迟到另一个进程(通过FastCGI)

安装量: 93,460

依赖项: 0

建议者: 0

安全: 0

星标: 43

关注者: 10

分支: 10

开放问题: 4

类型:symfony-bundle

0.3.1 2018-08-01 13:59 UTC

README

此包允许您在PHP中运行异步后台进程。您不需要PHP-daemon,也不必为每个工作创建新的php进程(这很昂贵)。我们使用PHP-FPM,因为它解决了我们的性能和稳定性问题。

我写了一篇博客文章,解释了此包背后的原因,您可能想阅读。

注意事项

此项目不再由Fervo积极开发。我们仍然愿意合并PR,但我们正逐渐将其移出内部。如果您对此项目有投资兴趣并希望采用它,请联系我们magnus@fervo.se

用法

您可以通过两种方式延迟事件。您可以决定何时分派事件,使其延迟,或者可以允许一些监听器决定是否延迟。在这两种情况下,我们都分派事件并将工作放在消息队列上。

就像魔法一样,在某个后来的时候,一个工作者会将您的事件分派给您的监听器。您几乎唯一需要记住的是它在一个不同的进程中,并且代码不再在请求范围内执行。

让监听器决定

只需用fervo_deferred_event.listener而不是kernel.event_listener标记您的监听器,然后包就会完成剩下的工作。简单得就像馅饼。

让发布者决定

如果您想将所有监听器的事件都执行在不同的线程中,您必须将事件包装在DeferEvent中。然后使用事件分发器并分派'fervo.defer'。

$event = new DeferEvent('foo.action', new MyEvent());
$this->get('event_dispatcher')->dispatch('fervo.defer', $event);

设置

服务器软件

您需要安装一个消息队列和一个工作者。工作者将从消息队列中提取工作并启动执行。

目前我们支持所有支持AMQP和Sidekiq的消息队列。

以下是一些工作者的列表

Symfony设置

将包添加到您的composer文件中,以及您的AppKernel。按以下方式配置包

# Sidekiq example
fervo_deferred_event:
    backend:
        type: sidekiq
        sidekiq_client_service: sidekiq_client

# Java/AMQP example:
fervo_deferred_event:
    backend:
        type: amqp
        amqp_config:
            host: "localhost"             #default
            port: 5672                    #default
            batch_publishing: false       #can only be true if you are using videlalvaro/php-amqplib v.2.2.0 or above
        message_headers:
            fastcgi_host: "localhost"     #default
            fastcgi_port: 9000            #default

您还需要设置以下之一(取决于您的后端类型)

错误处理

我们负责处理Java工作者的错误。当工作者意外终止时,我们将消息和错误消息保存到另一个队列中。您可以订阅该队列以记录错误并重试执行工作。