了解 PHP 事件调度系统

rin*_*t.6 3 php events laravel laravel-events

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

这个例子在 Laravel 文档中:

protected $listen = [
    'App\Events\OrderShipped' => [
        'App\Listeners\SendShipmentNotification',
    ],
];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Aug*_*gwa 5

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

简而言之,它只是一个文本对象数组。

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

$eventManager->dispatch('my_cool_event_name', $eventPayload);
Run Code Online (Sandbox Code Playgroud)

my_cool_event_name然后,这将通过仅进行数组查找来查找正在侦听事件的任何内容

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

    ]
];
Run Code Online (Sandbox Code Playgroud)

因此,从上面的数组示例中,它发现 3 个事件正在监听my_cool_event_name,然后它将实例化events\notifyController并运行通过 传递给每个事件的方法$eventPayload

如果你my_cool_event_name在执行过程中从未调度过,那么什么都不会被实例化