【问题标题】:Understanding PHP event dispatching systems了解 PHP 事件调度系统
【发布时间】:2017-07-20 05:06:39
【问题描述】:

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

这个例子在 Laravel 文档中:

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

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

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

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

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

【问题讨论】:

  • 单个事件的开销非常低,当一个事件被触发时,它会寻找合适的监听器,然后实例化它们。
  • 120 个事件侦听器在企业级 CRM 或 ERP 或诸如此类之外似乎有点高,但我认为调度程序本身正在根据事件键控制侦听器处理程序的实例化。所以实际上它是一个包含您的关联的数组,当满足第一级条件时,第二级关联被实例化(由调度程序)。

标签: php laravel events laravel-events


【解决方案1】:

事件侦听器系统的工作原理。

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

所以在 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,那么什么都不会被实例化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2014-03-26
    • 1970-01-01
    • 2023-03-18
    • 2011-01-24
    • 2020-05-18
    • 2013-12-20
    相关资源
    最近更新 更多