php - 了解 PHP 事件调度系统

标签 php laravel events laravel-events

我从来没有在 PHP 中做过任何事件驱动的事情,只做过 Node.js,所以我试图了解事件调度系统在 PHP 中是如何工作的(例如 Laravel eventsCakePHP eventsSymfony 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

如果您在执行期间从未分派(dispatch) my_cool_event_name 则不会实例化任何内容

关于php - 了解 PHP 事件调度系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42522116/

相关文章:

c# - 如何确保在按钮的单击事件之前触发文本框的 textchanged 事件?

php - 从同一个连接表中获取两个值

php - 仅在字符串中合并 Laravel 集合键

php - 如何获取 php 键作为 php 数组中的值

php - Dropzone 在后端 Laravel 中没有有效的 MIME 类型?

php - 在 Laravel json 响应中使用访问器和修改器

actionscript-3 - as3 中的自定义事件类型标识符是否需要唯一?

javascript - event.preventDefault() 函数在 IE 中不起作用

php - 如何在 PHP 中验证文本不是乱码?

php - 字符串数据,右截断 : 1406 Data too long on Bit Column