2017-03-01 71 views
2

我从来没有做过任何事件驱动的PHP,只有Node.js,所以我想了解事件调度系统如何在PHP中工作(如Laravel events,CakePHP eventsSymfony event dispatcher)。了解PHP事件调度系统

这个例子是在Laravel文档:

protected $listen = [ 
    'App\Events\OrderShipped' => [ 
     'App\Listeners\SendShipmentNotification', 
    ], 
]; 

由于在Apache上运行PHP脚本的生命周期基本上是请求的生命周期,这是不是意味着所有的听众都实例化每个请求的事件?

因此,如果我在我的应用程序中有120个听众(即在此$listen属性中列出),那么每次浏览一个页面时,他们中的120个都将被实例化?或者,只有在调度适当的事件时,侦听器对象才会被实例化?

在整个请求的持续时间内,甚至可能没有单个事件触发,听众对每个请求实例化的效率似乎相当低下。

这是我应该关注的东西吗?

+0

为个别事件的开销是相当低的,当事件被激活,它会寻找合适的听众,然后实例化它们。 – Augwa

+0

事件监听器似乎有点高企业级的CRM或ERP之外,但我认为调度器本身正在控制基于事件密钥的监听器处理器的实例化。所以真的是一个数组来保存你的关联,当第一级条件满足时,第二级关联被实例化(由调度员)。 –

回答

2

事件监听器系统如何工作。

用最简单的术语来说,它只是一个文本对象的数组。

所以在symfony中,你可能会做这样的事情

$eventManager->dispatch('my_cool_event_name', $eventPayload); 

然后,这将寻找任何由只是在做一个阵列侦听事件my_cool_event_name从查找

$events = [ 
    'my_cool_event_name' => [ 
     'events\notifyController::email', 
     'events\notifyController::text', 
     'events\notifyController::tweet', 
    ], 
    'another_event' => [ 

    ] 
]; 

所以上面的数组示例发现3个事件在my_cool_event_name上侦听,然后它会立即events\notifyController并运行通过$eventPayload到每个事件的方法。

如果你从来没有在执行过程中派出my_cool_event_name再没有获取instansiated