0%

swoole 心跳检测

服务端设计心跳包的目的,网上炒了一段,如果想要仔细了解的同学可以去搜寻一下对应的资料

  • 探知对端应用是否存活,服务端客户端都可以发心跳包,一般都是客户端发送心跳包,服务端用于判断客户端是否在线,从而对服务端内存缓存数据进行清理(玩家下线等);问题在于,通过TCP四次握手断开的设定,我们也是可以通过Socket的read方法来判断TCP连接是否断开,从而做出相应的清理内存动作

1.话不多说上代码,服务端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('127.0.0.1', 9501);

$server->set([
'heartbeat_idle_time' => 3, // 表示一个连接如果3秒内未向服务器发送任何数据,此连接将被强制关闭
'heartbeat_check_interval' => 2, // 表示每2秒遍历一次
]);


//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "Client: Connect.\n";
});

//监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
$server->send($fd, "Server: " . $data);
});

//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "Client: Close.\n";
});

//启动服务器
$server->start();

2.客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//new对象
$client = new Swoole\Client(SWOOLE_SOCK_TCP );
//建立tcp连接
if (!$client->connect('127.0.0.1', 9501, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}

//定时器每4千毫秒执行一次
swoole_timer_tick(4000, function ($timer_id) use ($client) {
echo "string\n";
//发送消息
$client->send(1);
//接收消息
$client->recv();
});

  • 注意使用sleep()函数会影响定时器的执行,因为sleep函数会阻碍整个php程序的进程