3

我从来没有在 PHP 中做过任何事件驱动的事情,只有 Node.js,所以我试图了解事件调度系统在 PHP 中是如何工作的(例如Laravel 事件CakePHP 事件Symfony 事件调度器)。

这个例子在 Laravel 文档中:

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

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

因此,如果我的应用程序中有 120 个侦听器(即在此$listen属性中列出),是否每次访问页面时都会实例化所有 120 个侦听器?还是仅在调度适当的事件时才实例化侦听器对象?

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

这是我什至应该关心的事情吗?

4

1 回答 1

4

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

简单来说,它只是一个文本对象数组。

所以在 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在执行期间从未调度过,那么什么都不会被实例化

于 2017-03-01T02:57:58.867 回答