Home  >  Article  >  PHP Framework  >  How to implement TCP long connection in Swoole

How to implement TCP long connection in Swoole

WBOY
WBOYOriginal
2023-06-25 18:35:251761browse

With the rapid development of the Internet, the application of TCP protocol is becoming more and more widespread. Especially in the fields of online games, instant messaging, financial transactions and other fields, TCP long connection is indispensable. As a high-performance PHP network communication framework, Swoole can naturally perfectly support TCP long connections. This article will share how to implement TCP long connections in Swoole.

1. Swoole’s TCP long connection

In Swoole, TCP long connection means that after the client and the server establish a network connection, the client can make multiple requests and requests through the connection. Response until the client actively closes the connection or an exception occurs in the connection. Compared with short connections, TCP long connections can reduce the number of TCP three-way handshakes and four waves, reduce network latency and resource usage, and improve the throughput and stability of the server. Therefore, it is widely used in high-concurrency scenarios.

2. Implementation steps of TCP long connection

  1. Establishing TCP server

In Swoole, we can create a TCP server through the following code :

$serv = new SwooleServer("127.0.0.1", 9501);

$serv->on('connect', function ($server, $fd) {
    echo "Client: Connect.
";
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
});

$serv->on('close', function ($server, $fd) {
    echo "Client: Close.
";
});

$serv->start();

In the above code, we created a TCP server listening at 127.0.0.1:9501 and registered three event callback functions: connect, receive and close. Among them, the connect event will be executed after the client establishes a connection with the server, the receive event will be executed after the server receives the client request message, and the close event will be executed after the client actively closes the connection or the connection is abnormally disconnected.

  1. Implementing TCP long connections

For TCP long connections, based on the above code, we only need to add a variable to store the client connection in the connect event. Can:

$serv = new SwooleServer("127.0.0.1", 9501);

// 存储客户端连接的变量
$connections = array();

$serv->on('connect', function ($server, $fd) use (&$connections) {
    echo "Client: Connect.
";
    $connections[$fd] = array(
        'fd' => $fd,
        'last_time' => time()
    );
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
});

$serv->on('close', function ($server, $fd) use (&$connections) {
    echo "Client: Close.
";
    // 删除客户端连接
    unset($connections[$fd]);
});

$serv->start();

In the above code, we define a $connections array to store client connections. When a new connection is established, we store the connection information in the array and record the last communication time. ;When the connection is closed, we delete the connection information from the array.

In addition, in order to avoid disconnection caused by no data interaction for a long time, we can use a timer to detect a connection that has not communicated for a long time every once in a while and disconnect it:

$serv = new SwooleServer("127.0.0.1", 9501);

// 存储客户端连接的变量
$connections = array();

$serv->on('connect', function ($server, $fd) use (&$connections) {
    echo "Client: Connect.
";
    $connections[$fd] = array(
        'fd' => $fd,
        'last_time' => time()
    );
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
    // 更新最后通信时间
    global $connections;
    $connections[$fd]['last_time'] = time();
});

$serv->on('close', function ($server, $fd) use (&$connections) {
    echo "Client: Close.
";
    // 删除客户端连接
    unset($connections[$fd]);
});

// 定时器,检测长时间没有通信的连接并断开
$serv->tick(1000, function() use (&$connections) {
    global $serv;
    $now = time();
    foreach($connections as $fd => $conn) {
        if ($now - $conn['last_time'] > 60) {
            $serv->close($fd);
            unset($connections[$fd]);
        }
    }
});

$serv->start();

In the above code, we added a timer to detect the last communication time of all connections every second. If it exceeds a certain time (60 seconds in this example), the connection is closed and removed from $connections Delete the connection information from the array.

3. Summary

Through the above steps, we can implement TCP long connection in Swoole. It should be noted that in actual development, the implementation of long connections needs to be optimized based on specific business conditions, such as customizing heartbeat packets, setting timeouts, monitoring connection status, etc., so as to ensure the stability and reliability of long connections. I hope this article can help you implement TCP long connections.

The above is the detailed content of How to implement TCP long connection in Swoole. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn