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