Swoole에서 TCP 긴 연결을 구현하는 방법

WBOY
풀어 주다: 2023-06-25 18:35:25
원래의
1789명이 탐색했습니다.

인터넷의 급속한 발전과 함께 TCP 프로토콜의 적용이 점점 더 널리 보급되고 있으며, 특히 온라인 게임, 인스턴트 메시징, 금융 거래 등의 분야에서 TCP 긴 연결은 필수 불가결합니다. 고성능 PHP 네트워크 통신 프레임워크인 Swoole은 자연스럽게 TCP 긴 연결을 완벽하게 지원할 수 있습니다. 이 기사에서는 Swoole에서 TCP 긴 연결을 구현하는 방법을 공유합니다.

1. Swoole의 TCP 영구 연결

Swoole에서 TCP 영구 연결은 클라이언트와 서버가 네트워크 연결을 설정한 후 클라이언트가 연결을 적극적으로 종료할 때까지 해당 연결을 통해 여러 요청과 응답을 할 수 있음을 의미합니다. 연결이 비정상입니다. 짧은 연결과 비교하여 TCP 긴 연결은 TCP 3방향 핸드셰이크 및 4웨이브 수를 줄이고, 네트워크 대기 시간과 리소스 사용량을 줄이며, 서버의 처리량과 안정성을 향상시킬 수 있으므로 높은 동시성 시나리오에서 널리 사용됩니다. .

2. TCP 긴 연결 구현 단계

  1. TCP 서버 구축

Swoole에서는 다음 코드를 통해 TCP 서버를 생성할 수 있습니다.

$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();
로그인 후 복사

위 코드에서는 127.0에 TCP 서버를 생성했습니다. 0.1 :9501은 TCP 서버를 모니터링하고 연결, 수신 및 닫기의 세 가지 이벤트 콜백 기능을 등록합니다. 그 중 connect 이벤트는 클라이언트가 서버와 연결을 맺은 후에 실행되고, receive 이벤트는 서버가 클라이언트 요청 메시지를 받은 후에 실행되며, close 이벤트는 클라이언트가 적극적으로 연결을 닫거나 연결을 끊은 후에 실행됩니다. 연결이 비정상적으로 끊어졌습니다.

  1. TCP 긴 연결 구현

위의 코드를 기반으로 TCP 긴 연결의 경우 연결 이벤트에 클라이언트 연결을 저장하는 변수만 추가하면 됩니다.

$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();
로그인 후 복사

위 코드에서 A $를 정의합니다. 클라이언트 연결을 저장하는 연결 배열입니다. 새 연결이 설정되면 연결 정보를 배열에 저장하고 연결이 닫힐 때 마지막 통신 시간을 기록하며 배열에서 연결 정보를 삭제합니다.

또한 오랫동안 데이터 상호 작용이 없어 연결이 끊어지는 것을 방지하기 위해 타이머를 사용하여 가끔씩 오랫동안 통신이 없는 연결을 감지하고 연결을 끊을 수 있습니다.

$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();
로그인 후 복사

위에서 코드를 추가하면 모든 연결의 마지막 통신 시간을 1초마다 감지하는 타이머가 생성되며, 특정 시간(이 예에서는 60초)을 초과하면 연결이 종료되고 $connections 배열에서 연결 정보가 삭제됩니다.

3. 요약

위 단계를 통해 Swoole에서 TCP 긴 연결을 구현할 수 있습니다. 실제 개발에서는 긴 연결의 안정성과 신뢰성을 보장하기 위해 하트비트 패킷 사용자 정의, 시간 제한 설정, 연결 상태 모니터링 등과 같은 특정 비즈니스 조건에 따라 긴 연결 구현을 최적화해야 합니다. 사이. 이 기사가 TCP 긴 연결을 구현하는 데 도움이 되기를 바랍니다.

위 내용은 Swoole에서 TCP 긴 연결을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿