swoole如何维持TCP长连接状态,及链接失效问题
第一种方式:
调整系统内核参数,/proc/sys/net/ipv4/tcp_fin_timeout
缺点:有兼容性,不够灵活
第二种方式:
配置tcp_keepidle,进行服务端检测连接状态,
1 $serv = new Swoole\Server("192.168.2.194", 6666, SWOOLE_PROCESS); 2 $serv->set(array( 3 'worker_num' => 1, 4 'open_tcp_keepalive' => 1, 5 'tcp_keepidle' => 4, //4s没有数据传输就进行检测 6 'tcp_keepinterval' => 1, //1s探测一次 7 'tcp_keepcount' => 5, //探测的次数,超过5次后还没回包close此连接 8 )); 9 10 $serv->on('connect', function ($serv, $fd) { 11 var_dump("Client:Connect $fd"); 12 }); 13 14 $serv->on('receive', function ($serv, $fd, $reactor_id, $data) { 15 var_dump($data); 16 }); 17 18 $serv->on('close', function ($serv, $fd) { 19 var_dump("close fd $fd"); 20 }); 21 22 $serv->start();
或者使用心跳检测
array( 'heartbeat_idle_time' => 600, // 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭 'heartbeat_check_interval' => 60, // 表示每60秒遍历一次 );
缺点:需要客户端配合,复杂度适中
第三种方式:
应用层keepidle,
客户端定时发送ping包,然后服务端回复pong包(mysql状态,redis状态,相关Rpc服务状态)