我从来没有在PHP中做任何事件驱动,只有Node.js,所以我试图理解事件调度系统如何在PHP中工作(例如Laravel events,{{3 }和CakePHP events)。
此示例位于Laravel文档中:
protected $listen = [
'App\Events\OrderShipped' => [
'App\Listeners\SendShipmentNotification',
],
];
由于在Apache上运行的PHP脚本的生命周期基本上是请求的生命周期,这是否意味着每个请求都会实例化所有事件侦听器?
因此,如果我的应用程序中有120个侦听器(即在此$listen
属性中列出),那么每次访问页面时都会实例化120个侦听器吗?或者,只有在调度适当的事件时才会实例化侦听器对象?
在请求的整个持续时间内,甚至可能没有触发单个事件,对每个请求实例化侦听器似乎效率很低。
这是我甚至应该关注的事情吗?
答案 0 :(得分:3)
事件监听器系统的工作原理。
简单来说,它只是一个文本对象数组。
所以在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
的方法到每个事件。< / p>
如果您在执行期间从未派遣过my_cool_event_name
,那么任何事情都无法实现