gateway的长连接出现监听不到onclose事件的情况

fqfisher

在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;
        }
}
3282 4 0
4个回答

latin

onclose不是一定能执行的,有些时候防火墙直接给你掐断,服务端和客户端永远不知道连接已经断开

  • fqfisher 2018-01-26

    防火墙掐断是在什么情况下产生的?用户建立了连接后,为什么会出现防火墙切断? 还有就是出现了这种情况该如何处理???

maq

试试自己加上心跳,一般能避免被路由器切断,即便被切断,因为心跳包发送失败,也不至于丢失 onclose。

  • fqfisher 2018-01-29

    心跳有了 按文档的方式加的心跳,还是会有监听不到onclose的情况

  • maq 2018-01-29

    @2255:不行就再看看 onError 的情况 http://doc.workerman.net/315152

    你这个情况有点奇怪,可能要仔细排查才能确定原因了。

  • fqfisher 2018-01-29

    @3346:好的 谢谢 我再跟踪下问题

顺从

楼主,您的问题有解决了,我这边在使用workerman的过程中也是会出现

  • 暂无评论
blogdaren

断电、断网、路由器异常等等极端情况都会造成无法及时触发 onClose 。
建议你根据官方手册好好检查下这个参数: Gateway::$pingNotResponseLimit > 0 , 大于0代表客户端必须在规定的时间内发送心跳给服务端,否则服务端会关闭对应连接,并触发onClose。

  • 暂无评论
年代过于久远,无法发表回答
🔝