幸福日记

WebSocket服务端开发(七)-WebSocketServer类健康检查函数

函数实现如下:

  function healthCheck() {
    //获取当前时间
    $now = time();

    //记录最后健康检查时间
    $this->lastHealthCheck = $now;

    //初始化不健康的连接列表
    $unhealthyList = array();

    //循环连接池
    foreach ($this->socketListMap as $socketId => $session) {
      //找出最后通信时间超过超时时间(目前超时时间与健康检查时间相同)
      if ($now - $session['lastCommuicate'] > $this->healthCheckInterval) {
        array_push($unhealthyList, $socketId);
      }
    }
    if ($this->debug) {
      echo 'Unhealthy socket:' . implode(',', $unhealthyList) . "\n";
    }

    //健康检查回调,默认的行为是直接断开连接
    //可以根据自己的需求改进,如发送ping帧探测等,如果仍无响应再断开连接
    $this->onafterhealthcheck($unhealthyList);
  }

注意:由于该类只是简单的实现了WebSocket协议,没有使用多线程处理,故健康检查只有在处理完一次连接后才有可能执行。如果设置健康检查时间间隔为10分钟,10分钟内收到任何数据,那么也不会进行健康检查,直到收到一个连接后才会进行健康检查。
收发数据都会更新最后通信时间的值,如果希望只在服务器收到信息时更新最后通信时间,可以在recv和send函数中修改。
建议定时从服务器发送心跳包以维持连接。

退出移动版