了解 PHP 事件调度系统
Understanding PHP event dispatching systems
我从来没有在 PHP 中做过任何事件驱动的事情,只在 Node.js 中做过,所以我试图了解事件调度系统在 PHP 中的工作原理(例如 Laravel events, CakePHP events and Symfony event dispatcher).
此示例位于 Laravel 文档中:
protected $listen = [
'App\Events\OrderShipped' => [
'App\Listeners\SendShipmentNotification',
],
];
由于 Apache 上 PHP 脚本 运行 的生命周期基本上就是请求的生命周期,这是否意味着所有事件侦听器都随每个请求实例化?
因此,如果我的应用程序中有 120 个侦听器(即在 $listen
属性 中列出),那么每次访问页面时是否都会实例化所有 120 个侦听器?或者侦听器对象是否仅在调度适当的事件时才被实例化?
当在请求的整个持续时间内甚至可能没有触发单个事件时,为每个请求实例化侦听器似乎效率很低。
这是我应该关心的事情吗?
事件侦听器系统的工作原理。
简单来说,它只是一个文本对象数组。
所以在 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
则不会实例化任何内容
我从来没有在 PHP 中做过任何事件驱动的事情,只在 Node.js 中做过,所以我试图了解事件调度系统在 PHP 中的工作原理(例如 Laravel events, CakePHP events and Symfony event dispatcher).
此示例位于 Laravel 文档中:
protected $listen = [
'App\Events\OrderShipped' => [
'App\Listeners\SendShipmentNotification',
],
];
由于 Apache 上 PHP 脚本 运行 的生命周期基本上就是请求的生命周期,这是否意味着所有事件侦听器都随每个请求实例化?
因此,如果我的应用程序中有 120 个侦听器(即在 $listen
属性 中列出),那么每次访问页面时是否都会实例化所有 120 个侦听器?或者侦听器对象是否仅在调度适当的事件时才被实例化?
当在请求的整个持续时间内甚至可能没有触发单个事件时,为每个请求实例化侦听器似乎效率很低。
这是我应该关心的事情吗?
事件侦听器系统的工作原理。
简单来说,它只是一个文本对象数组。
所以在 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
则不会实例化任何内容