在onclose方法处增加了业务代码,偶尔会出现没有进入onClose的方法内,这是什么原因?日志跟踪也没有,是不是会出现workman服务无法监听到长连接断线的情况呢?
public static function onClose($client_id) {
$port = $_SERVER;
switch ($port) {
case '8282':
default:
$url = 'xxxxxxx';
$data = json_encode();
$dir_name = '/www/gateway/logs/';
if(!is_dir($dir_name)){
@mkdir($dir_name, 0777, true);
}
$result = Curl::curl_post($url, , 3);
if(!$result || $result != 0){
file_put_contents($dir_name.date('Ymd').'.log', date('Y-m-d H:i:s').' ' .json_encode($result).' client_id:'.$client_id.PHP_EOL,FILE_APPEND);
}
break;
}
}
onclose不是一定能执行的,有些时候防火墙直接给你掐断,服务端和客户端永远不知道连接已经断开
防火墙掐断是在什么情况下产生的?用户建立了连接后,为什么会出现防火墙切断? 还有就是出现了这种情况该如何处理???
试试自己加上心跳,一般能避免被路由器切断,即便被切断,因为心跳包发送失败,也不至于丢失 onclose。
心跳有了 按文档的方式加的心跳,还是会有监听不到onclose的情况
@2255:不行就再看看 onError 的情况 http://doc.workerman.net/315152
你这个情况有点奇怪,可能要仔细排查才能确定原因了。
@3346:好的 谢谢 我再跟踪下问题
楼主,您的问题有解决了,我这边在使用workerman的过程中也是会出现
断电、断网、路由器异常等等极端情况都会造成无法及时触发 onClose 。
建议你根据官方手册好好检查下这个参数: Gateway::$pingNotResponseLimit > 0 , 大于0代表客户端必须在规定的时间内发送心跳给服务端,否则服务端会关闭对应连接,并触发onClose。