關於 Laravel 框架事件系統的一點認識

kairye發表於2019-07-03

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',
],

二、測試過程

測試過程主要對事件監聽器是否使用佇列,使用不同佇列等情況進行測試。

  • TestListener1TestListener2都不使用佇列。

關於 Laravel 框架事件系統的一點認識

  • TestListener1TestListener2使用相同佇列。

關於 Laravel 框架事件系統的一點認識

  • TestListener1TestListener2使用不同佇列。

關於 Laravel 框架事件系統的一點認識

  • TestListener1使用佇列 ,TestListener2不使用佇列。

關於 Laravel 框架事件系統的一點認識

三、測試結論

Laravel的事件系統,當一個事件有多個事件監聽器的時候,事件的執行順序如下:

  • 都使用相同佇列,或都不使用佇列時,多個事件按同步順序執行,即A執行完後才執行B
  • 多個事件使用不同佇列時,事件之間按非同步方式執行,即A、B會同時執行;如果有某些事件使用同一佇列,則同一佇列中的按同步方式執行。

不足指出,望大家討論批評指正!

相關文章