fervo / deferred-event-bundle
将事件延迟到另一个进程(通过FastCGI)
Requires
- php: >=5.4
- symfony/console: ~3.0
- symfony/event-dispatcher: ~3.0
- symfony/framework-bundle: ~3.0
Suggests
- musicglue/sidekiq-job-pusher: dev-master
- redeye/sidekiq-bundle: Simplifies the configuration of your Sidekiq client
- videlalvaro/php-amqplib: To enable pushing to a AMQP compatible queue like RabbitMQ. Use version 2.3.0 or above
This package is auto-updated.
Last update: 2024-09-12 03:53:53 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的消息队列。
以下是一些工作者的列表
- fervo/deferred-event-worker,用Ruby编写。
- HappyR/DeferredEventJavaWorker,用Java编写。
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
您还需要设置以下之一(取决于您的后端类型)
- musicglue/sidekiq-job-pusher。设置客户端服务,并将其传递到配置中。
- videlalvaro/php-amqplib。只需将其添加到您的composer.json中。
错误处理
我们负责处理Java工作者的错误。当工作者意外终止时,我们将消息和错误消息保存到另一个队列中。您可以订阅该队列以记录错误并重试执行工作。