监听事件

系统事件

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

  • 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. protected $listeners = [
  5. // 监听器列表
  6. TestListener1::class,
  7. // TestListener2::class,
  8. ];
  9. private $data;
  10. public function __construct($data)
  11. {
  12. $this->data = $data;
  13. }
  14. public function getData()
  15. {
  16. return $this->data;
  17. }
  18. }

2.创建监听器类。

  1. use Hhxsv5\LaravelS\Swoole\Task\Task;
  2. use Hhxsv5\LaravelS\Swoole\Task\Listener;
  3. class TestListener1 extends Listener
  4. {
  5. /**
  6. * @var TestEvent
  7. */
  8. protected $event;
  9. public function handle()
  10. {
  11. \Log::info(__CLASS__ . ':handle start', [$this->event->getData()]);
  12. sleep(2);// 模拟一些慢速的事件处理
  13. // 监听器中也可以投递Task,但不支持Task的finish()回调。
  14. // 注意:config/laravels.php中修改配置task_ipc_mode为1或2,参考 https://wiki.swoole.com/#/server/setting?id=task_ipc_mode
  15. $ret = Task::deliver(new TestTask('task data'));
  16. var_dump($ret);
  17. // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
  18. }
  19. }

3.触发事件。

  1. // 实例化TestEvent并通过fire触发,此操作是异步的,触发后立即返回,由Task进程继续处理监听器中的handle逻辑
  2. use Hhxsv5\LaravelS\Swoole\Task\Event;
  3. $event = new TestEvent('event data');
  4. // $event->delay(10); // 延迟10秒触发
  5. // $event->setTries(3); // 出现异常时,累计尝试3次
  6. $success = Event::fire($event);
  7. var_dump($success);// 判断是否触发成功