Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk melaksanakan sambungan panjang TCP dalam Swoole

Bagaimana untuk melaksanakan sambungan panjang TCP dalam Swoole

WBOY
WBOYasal
2023-06-25 18:35:251782semak imbas

Dengan perkembangan pesat Internet, aplikasi protokol TCP menjadi semakin meluas, terutamanya dalam bidang permainan dalam talian, pemesejan segera, urus niaga kewangan, dan lain-lain, sambungan panjang TCP amat diperlukan. Sebagai rangka kerja komunikasi rangkaian PHP berprestasi tinggi, Swoole secara semula jadi boleh menyokong sambungan panjang TCP Artikel ini akan berkongsi cara untuk melaksanakan sambungan panjang TCP dalam Swoole.

1. Sambungan berterusan TCP Swoole

Dalam Swoole, sambungan berterusan TCP bermakna selepas pelanggan dan pelayan mewujudkan sambungan rangkaian, pelanggan boleh membuat beberapa permintaan dan respons melalui sambungan sehingga pelanggan menutup sambungan secara aktif sambungan tidak normal. Berbanding dengan sambungan pendek, sambungan panjang TCP boleh mengurangkan bilangan jabat tangan tiga hala TCP dan empat gelombang, mengurangkan kependaman rangkaian dan penggunaan sumber, dan meningkatkan daya pemprosesan dan kestabilan pelayan Oleh itu, ia digunakan secara meluas dalam senario konkurensi tinggi .

2. Langkah-langkah pelaksanaan sambungan panjang TCP

  1. Mewujudkan pelayan TCP

Dalam Swoole, kami boleh mencipta pelayan TCP melalui kod berikut:

$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();

Dalam kod di atas, kami mencipta pelayan TCP.0 di 127. 0.1 :9501 memantau pelayan TCP dan mendaftarkan tiga fungsi panggil balik acara: sambung, terima dan tutup. Antaranya, acara sambung akan dilaksanakan selepas klien mewujudkan sambungan dengan pelayan, acara terima akan dilaksanakan selepas pelayan menerima mesej permintaan klien, dan acara tutup akan dilaksanakan selepas klien menutup sambungan secara aktif atau sambungan terputus secara tidak normal.

  1. Melaksanakan sambungan panjang TCP

Untuk sambungan panjang TCP, berdasarkan kod di atas, kami hanya perlu menambah pembolehubah untuk menyimpan sambungan klien dalam acara sambungan:

$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();

Dalam kod di atas, kami mentakrifkan A $ tatasusunan sambungan untuk menyimpan sambungan pelanggan Apabila sambungan baharu diwujudkan, kami menyimpan maklumat sambungan dalam tatasusunan dan merekodkan masa komunikasi terakhir apabila sambungan ditutup, kami memadam maklumat sambungan daripada tatasusunan.

Selain itu, untuk mengelakkan terputusnya sambungan yang disebabkan oleh tiada interaksi data untuk masa yang lama, kita boleh menggunakan pemasa untuk mengesan sambungan tanpa komunikasi untuk masa yang lama sekali-sekala dan memutuskannya:

$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();

Dalam perkara di atas kod, kami menambah Pemasa dicipta untuk mengesan masa komunikasi terakhir semua sambungan setiap saat Jika melebihi masa tertentu (60 saat dalam contoh ini), sambungan ditutup dan maklumat sambungan dipadamkan daripada tatasusunan $connections.

3. Ringkasan

Melalui langkah di atas, kita boleh melaksanakan sambungan panjang TCP dalam Swoole. Perlu diingatkan bahawa dalam pembangunan sebenar, pelaksanaan sambungan panjang perlu dioptimumkan mengikut keadaan perniagaan tertentu, seperti menyesuaikan paket degupan jantung, menetapkan tamat masa, memantau status sambungan, dll., untuk memastikan kestabilan dan kebolehpercayaan panjang. sambungan. Saya harap artikel ini dapat membantu anda melaksanakan sambungan panjang TCP.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan sambungan panjang TCP dalam Swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn