监听事件
系统事件
通常,你可以在这些事件中重置或销毁一些全局或静态的变量,也可以修改当前的请求和响应。
laravels.received_request
将Swoole\Http\Request
转成Illuminate\Http\Request
后,在Laravel内核处理请求前。
- // 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
- // 如果变量$events不存在,你也可以通过Facade调用\Event::listen()。
- $events->listen('laravels.received_request', function (\Illuminate\Http\Request $req, $app) {
- $req->query->set('get_key', 'hhxsv5');// 修改querystring
- $req->request->set('post_key', 'hhxsv5'); // 修改post body
- });
laravels.generated_response
在Laravel内核处理完请求后,将Illuminate\Http\Response
转成Swoole\Http\Response
之前(下一步将响应给客户端)。
- // 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
- // 如果变量$events不存在,你也可以通过Facade调用\Event::listen()。
- $events->listen('laravels.generated_response', function (\Illuminate\Http\Request $req, \Symfony\Component\HttpFoundation\Response $rsp, $app) {
- $rsp->headers->set('header-key', 'hhxsv5');// 修改header
- });
自定义的异步事件
此特性依赖
Swoole
的AsyncTask
,必须先设置config/laravels.php
的swoole.task_worker_num
。异步事件的处理能力受Task进程数影响,需合理设置task_worker_num。
1.创建事件类。
- use Hhxsv5\LaravelS\Swoole\Task\Event;
- class TestEvent extends Event
- {
- private $data;
- public function __construct($data)
- {
- $this->data = $data;
- }
- public function getData()
- {
- return $this->data;
- }
- }
2.创建监听器类。
- use Hhxsv5\LaravelS\Swoole\Task\Task;
- use Hhxsv5\LaravelS\Swoole\Task\Event;
- use Hhxsv5\LaravelS\Swoole\Task\Listener;
- class TestListener1 extends Listener
- {
- // 声明没有参数的构造函数
- public function __construct()
- {
- }
- public function handle(Event $event)
- {
- \Log::info(__CLASS__ . ':handle start', [$event->getData()]);
- sleep(2);// 模拟一些慢速的事件处理
- // 监听器中也可以投递Task,但不支持Task的finish()回调。
- // 注意:
- // 1.参数2需传true
- // 2.config/laravels.php中修改配置task_ipc_mode为1或2,参考 https://wiki.swoole.com/wiki/page/296.html
- $ret = Task::deliver(new TestTask('task data'), true);
- var_dump($ret);
- // throw new \Exception('an exception');// handle时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
- }
- }
3.绑定事件与监听器。
- // 在"config/laravels.php"中绑定事件与监听器,一个事件可以有多个监听器,多个监听器按顺序执行
- [
- // ...
- 'events' => [
- \App\Tasks\TestEvent::class => [
- \App\Tasks\TestListener1::class,
- //\App\Tasks\TestListener2::class,
- ],
- ],
- // ...
- ];
4.触发事件。
- // 实例化TestEvent并通过fire触发,此操作是异步的,触发后立即返回,由Task进程继续处理监听器中的handle逻辑
- use Hhxsv5\LaravelS\Swoole\Task\Event;
- $success = Event::fire(new TestEvent('event data'));
- var_dump($success);//判断是否触发成功