函数实现如下:
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函数中修改。
建议定时从服务器发送心跳包以维持连接。