ホームページ  >  記事  >  PHPフレームワーク  >  SwooleでTCPロングコネクションを実装する方法

SwooleでTCPロングコネクションを実装する方法

WBOY
WBOYオリジナル
2023-06-25 18:35:251723ブラウズ

インターネットの急速な発展に伴い、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.0.1:9501 でリッスンする TCP サーバーを作成し、connect、receive、close の 3 つのイベント コールバック関数を登録しました。このうち、connect イベントはクライアントがサーバーとの接続を確立した後に実行され、receive イベントはサーバーがクライアント要求メッセージを受信した後に実行され、close イベントはクライアントが積極的に接続を閉じた後に実行されるか、接続が異常に切断されました。

  1. TCP ロング接続の実装

TCP ロング接続の場合、上記のコードに基づいて、接続イベントにクライアント接続を保存する変数を追加するだけで済みます。 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();

上記のコードでは、クライアント接続を保存する $connections 配列を定義します。新しい接続が確立されると、配列に接続情報を保存し、最後の通信時間を記録します。接続が閉じられた場合は、配列から接続情報を削除します。

さらに、長時間データ通信がないことによる切断を避けるために、タイマーを使用して長時間通信のない接続を検出し、切断することができます。

$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秒)を超えるとコネクションを閉じて$から削除します。接続 アレイから接続情報を削除します。

3. まとめ

上記の手順により、Swoole で TCP ロング接続を実装することができます。実際の開発では、長時間接続の安定性と信頼性を確保するために、ハートビート パケットのカスタマイズ、タイムアウトの設定、接続ステータスの監視など、特定のビジネス条件に基づいて長時間接続の実装を最適化する必要があることに注意してください。接続。この記事が TCP ロング接続の実装に役立つことを願っています。

以上がSwooleでTCPロングコネクションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。