监听事件

系统事件

通常,你可以在这些事件中重置或销毁一些全局或静态的变量,也可以修改当前的请求和响应。

  • laravels.received_requestSwoole\Http\Request转成Illuminate\Http\Request后,在Laravel内核处理请求前。
  1. // 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
  2. // 如果变量$events不存在,你也可以通过Facade调用\Event::listen()。
  3. $events->listen('laravels.received_request', function (\Illuminate\Http\Request $req, $app) {
  4. $req->query->set('get_key', 'hhxsv5');// 修改querystring
  5. $req->request->set('post_key', 'hhxsv5'); // 修改post body
  6. });
  • laravels.generated_response 在Laravel内核处理完请求后,将Illuminate\Http\Response转成Swoole\Http\Response之前(下一步将响应给客户端)。
  1. // 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
  2. // 如果变量$events不存在,你也可以通过Facade调用\Event::listen()。
  3. $events->listen('laravels.generated_response', function (\Illuminate\Http\Request $req, \Symfony\Component\HttpFoundation\Response $rsp, $app) {
  4. $rsp->headers->set('header-key', 'hhxsv5');// 修改header
  5. });

自定义的异步事件

此特性依赖SwooleAsyncTask,必须先设置config/laravels.phpswoole.task_worker_num。异步事件的处理能力受Task进程数影响,需合理设置task_worker_num

1.创建事件类。

  1. use Hhxsv5\LaravelS\Swoole\Task\Event;
  2. class TestEvent extends Event
  3. {
  4. private $data;
  5. public function __construct($data)
  6. {
  7. $this->data = $data;
  8. }
  9. public function getData()
  10. {
  11. return $this->data;
  12. }
  13. }

2.创建监听器类。

  1. use Hhxsv5\LaravelS\Swoole\Task\Task;
  2. use Hhxsv5\LaravelS\Swoole\Task\Event;
  3. use Hhxsv5\LaravelS\Swoole\Task\Listener;
  4. class TestListener1 extends Listener
  5. {
  6. // 声明没有参数的构造函数
  7. public function __construct()
  8. {
  9. }
  10. public function handle(Event $event)
  11. {
  12. \Log::info(__CLASS__ . ':handle start', [$event->getData()]);
  13. sleep(2);// 模拟一些慢速的事件处理
  14. // 监听器中也可以投递Task,但不支持Task的finish()回调。
  15. // 注意:
  16. // 1.参数2需传true
  17. // 2.config/laravels.php中修改配置task_ipc_mode为1或2,参考 https://wiki.swoole.com/wiki/page/296.html
  18. $ret = Task::deliver(new TestTask('task data'), true);
  19. var_dump($ret);
  20. // throw new \Exception('an exception');// handle时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
  21. }
  22. }

3.绑定事件与监听器。

  1. // 在"config/laravels.php"中绑定事件与监听器,一个事件可以有多个监听器,多个监听器按顺序执行
  2. [
  3. // ...
  4. 'events' => [
  5. \App\Tasks\TestEvent::class => [
  6. \App\Tasks\TestListener1::class,
  7. //\App\Tasks\TestListener2::class,
  8. ],
  9. ],
  10. // ...
  11. ];

4.触发事件。

  1. // 实例化TestEvent并通过fire触发,此操作是异步的,触发后立即返回,由Task进程继续处理监听器中的handle逻辑
  2. use Hhxsv5\LaravelS\Swoole\Task\Event;
  3. $success = Event::fire(new TestEvent('event data'));
  4. var_dump($success);//判断是否触发成功