Понимание систем диспетчеризации событий PHP

Я никогда не делал ничего управляемого событиями в PHP, только Node.js, поэтому я пытаюсь понять, как работают системы диспетчеризации событий в PHP (например, события Laravel, События CakePHP и диспетчер событий Symfony).

Этот пример находится в документации Laravel:

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

Поскольку время жизни PHP-скрипта, работающего на Apache, в основном равно времени жизни запроса, означает ли это, что все прослушиватели событий создаются с каждым запросом?

Итак, если у меня есть 120 слушателей в моем приложении (т.е. перечисленных в этом свойстве $listen), будут ли все 120 из них создаваться каждый раз при посещении страницы? Или объекты прослушивателя создаются только тогда, когда отправляются соответствующие события?

Кажется довольно неэффективным, чтобы слушатели создавались с каждым запросом, когда за всю продолжительность запроса может не быть запущено ни одного события.

Это то, о чем я вообще должен беспокоиться?


person rink.attendant.6    schedule 01.03.2017    source источник
comment
Накладные расходы для отдельного события довольно низкие, когда событие запускается, оно ищет подходящих прослушивателей, а затем создает их экземпляры.   -  person Augwa    schedule 01.03.2017
comment
120 прослушивателей событий кажутся немного высокими за пределами CRM или ERP корпоративного уровня или чего-то еще, но я думаю, что диспетчер сам контролирует создание экземпляра обработчика прослушивателя на основе ключа события. Так что на самом деле это массив, который содержит ваши ассоциации, причем ассоциации второго уровня создаются (диспетчером) при выполнении условия первого уровня.   -  person Jared Farrish    schedule 01.03.2017


Ответы (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 во время выполнения, то ничего не создается.

person Augwa    schedule 01.03.2017