symfony-bundles / event-queue-bundle
Symfony EventQueue Bundle
v2.0.1
2017-10-17 06:52 UTC
Requires
- php: >=5.6
- symfony-bundles/bundle-dependency: ^1.0
- symfony-bundles/queue-bundle: ^1.0
- symfony/console: ^3.0
Requires (Dev)
- phpunit/php-code-coverage: ^3.3.0|^4.0
- phpunit/phpunit: ^5.3
README
安装
- 使用composer安装此包
composer require symfony-bundles/event-queue-bundle
- 在kernel中启用此包
public function registerBundles() { $bundles = [ // ... new SymfonyBundles\EventQueueBundle\SymfonyBundlesEventQueueBundle(), // ... ]; ... }
- 在您的config.yml中配置EventQueue包。
默认配置
sb_event_queue: service_name: 'event_queue' default_name: 'event:default' storage_path: '%kernel.cache_dir%/event-queue-daemon.%s.pid'
- 在您的config.yml中配置redis客户端。有关RedisBundle配置的更多信息,请参阅RedisBundle配置。
如何使用
向队列中添加事件
$dispatcher = $this->get('sb_event_queue'); $dispatcher->on(MyEvent::class, date('Y-m-d H:i:s'), 'Example message');
您的事件类必须实现SymfonyBundles\EventQueueBundle\EventInterface
(或扩展SymfonyBundles\EventQueueBundle\Event
类)并具有常量NAME
与事件名称。例如
namespace AppBundle\Event; use SymfonyBundles\EventQueueBundle\Event; class MyEvent extends Event { const NAME = 'event.example'; private $time; private $message; public function __construct($time, $message) { $this->time = $time; $this->message = $message; } public function getTime() { return $this->time; } public function getMessage() { return $this->message; } }
创建事件监听器。监听事件最常见的方式是注册事件监听器
namespace AppBundle\EventListener; use AppBundle\Event\MyEvent; class MyListener { public function onEventExample(MyEvent $event) { $event->getTime(); $event->getMessage(); // and we are doing something... } }
现在类已创建,您只需将其注册为服务并通知Symfony它是一个“监听器”
services: app.my_listener: class: AppBundle\EventListener\MyListener tags: - { name: kernel.event_listener, event: event.example }
执行(分发)队列中的所有事件
while ($dispatcher->count()) { $dispatcher->dispatch(); }
您可以通过指定事件管理器中的所需部分来分离事件
$dispatcher->setName('email.notifications'); $dispatcher->on(EmailNotifyEvent::class, 'Subject', 'Message Body', ['john@domain.com', 'alex@domain.com']); $dispatcher->on(EmailNotifyEvent::class, 'Another subject', 'Another message Body', ['demo@domain.com']); $dispatcher->setName('database.reindex'); $dispatcher->on(DatabaseReindexEvent::class, 'users'); $dispatcher->on(DatabaseReindexEvent::class, 'orders'); $dispatcher->on(DatabaseReindexEvent::class, 'products');
在这个例子中,将只执行来自email.notifications
部分的事件
$dispatcher->setName('email.notifications'); while ($dispatcher->count()) { $dispatcher->dispatch(); }
控制台命令
event:queue:dispatch
event:queue:daemon:start
event:queue:daemon:stop
在什么情况下应用事件队列是有用的
- 当发送电子邮件消息时
- 解析网站
- 以及其他情况,当处理过程的执行时间非常长,并且服务器必须立即返回响应时。