关于 Laravel 框架事件系统的一点认识

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会同时执行;如果有某些事件使用同一队列,则同一队列中的按同步方式执行。

不足指出,望大家讨论批评指正!

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

谢谢,正好看到这里

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!