Laravel的事件系統相信大家都很熟悉,在工作中也經常用到,比如使用者註冊時相關的業務處理,通過使用事件系統極大的方便了業務解耦。但多個事件監聽器之間的任務執行順序你清楚嗎?
一、測試程式碼準備
事件監聽器1 app\Listeners\TestListener1.php
public function handle(TestEvent $event)
{
\Log::info('監聽事件測試[TestListener1]開始'.time());
sleep(10);
\Log::info('監聽事件測試[TestListener1]結束'.time());
}
事件監聽器2 app\Listeners\TestListener2.php
public function handle(TestEvent $event)
{
\Log::info('監聽事件測試[TestListener2]開始'.time());
sleep(10);
\Log::info('監聽事件測試[TestListener2]結束'.time());
}
註冊事件 app\Providers\EventServiceProvider.php
'App\Events\TestEvent' => [
'App\Listeners\TestListener1',
'App\Listeners\TestListener2',
],
二、測試過程
測試過程主要對事件監聽器是否使用佇列,使用不同佇列等情況進行測試。
TestListener1
和TestListener2
都不使用佇列。
TestListener1
和TestListener2
使用相同佇列。
TestListener1
和TestListener2
使用不同佇列。
TestListener1
使用佇列 ,TestListener2
不使用佇列。
三、測試結論
Laravel的事件系統,當一個事件有多個事件監聽器的時候,事件的執行順序如下:
- 都使用相同佇列,或都不使用佇列時,多個事件按同步順序執行,即A執行完後才執行B
- 多個事件使用不同佇列時,事件之間按非同步方式執行,即A、B會同時執行;如果有某些事件使用同一佇列,則同一佇列中的按同步方式執行。
不足指出,望大家討論批評指正!