请求方法结束后执行

假如你使用了单例模式,需要清理请求时的GET POST 等全局变量或本次请求的日志运行记录,就可以在此方法内执行。

  1. protected function afterAction( $actionName ) : void

示例

想一下,我如果想知道那些请求的执行时间长短,或者记录一些所谓的 慢请求, 那么我们可以通过两个事件 onRequest 和当前这个 afterAction 来完成。

看下代码,首先在 onRequest 增加一个时间戳,注意这是在请求开始执行之前触发的,所以我们可以精准的记录下来请求花费的时间。

  1. $request->withAttribute('requestTime', microtime(true));

很简单,我只是给请求开始的时候给请求增加了一个属性 requestTime 用来记录开始时间。接下来是 afterAction

  1. //从请求里获取之前增加的时间戳
  2. $reqTime = $request->getAttribute('requestTime');
  3. //计算一下运行时间
  4. $runTime = round(microtime(true) - $reqTime, 3);
  5. //获取用户IP地址
  6. $ip = ServerManager::getInstance()->getServer()->connection_info($request->getSwooleRequest()->fd);
  7. //拼接一个简单的日志
  8. $logStr = ' | '.$ip['remote_ip'] .' | '. $runTime . '|' . $request->getUri() .' | '.
  9. $request->getHeader('user-agent')[0];
  10. //判断一下当执行时间大于1秒记录到 slowlog 文件中,否则记录到 access 文件
  11. if($runTime > 1){
  12. Logger::getInstance()->log($logStr, 'slowlog');
  13. }else{
  14. logger::getInstance()->log($logStr,'access');
  15. }

仅此而已