Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana Swooole menyokong fungsi pemotongan dan penyambungan semula WebSocket

Bagaimana Swooole menyokong fungsi pemotongan dan penyambungan semula WebSocket

王林
王林asal
2023-06-25 10:02:471832semak imbas

WebSocket telah menjadi protokol biasa dalam pembangunan web moden Ia boleh mewujudkan saluran komunikasi dua hala antara pelanggan (pelayar) dan pelayan. Walau bagaimanapun, persekitaran rangkaian yang tidak stabil atau sebab lain yang tidak diketahui boleh menyebabkan sambungan WebSocket terputus secara tidak dijangka, yang akan menyebabkan masalah besar kepada pembangun dalam pembangunan dan penyelenggaraan.

Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi untuk PHP Ia menyokong protokol WebSocket dan menyediakan fungsi pemutusan sambungan dan penyambungan semula WebSocket. Artikel ini akan memperkenalkan cara Swoole melaksanakan fungsi pemutusan dan penyambungan semula WebSocket, dengan harapan dapat membantu pembangun mengatasi persekitaran rangkaian yang tidak stabil dengan lebih baik.

Senario pemutusan sambungan dan penyambungan semula WebSocket

Permintaan untuk fungsi pemotongan dan penyambungan semula WebSocket terutamanya berlaku dalam senario berikut:

  1. Persekitaran rangkaian tidak stabil.
  2. Pelanggan menutup pelayar atau sebab lain menyebabkan pelanggan memutuskan sambungan.
  3. Situasi tidak normal berlaku pada bahagian pelayan, menyebabkan sambungan terputus.

Untuk situasi ini, jika tiada fungsi pemotongan dan penyambungan semula, ia akan menyebabkan pengguna log masuk semula, menyambung semula dan operasi lain, yang akan memberi impak yang besar kepada pengalaman pengguna.

Fungsi pemutusan sambungan dan penyambungan semula WebSocket yang disediakan oleh Swoole

Sokongan Swoole untuk protokol WebSocket adalah sangat komprehensif dan lengkap Ia menyediakan satu siri fungsi panggil balik acara yang membolehkan kami melaksanakan fungsi pemutusan sambungan dan penyambungan semula WebSocket melalui fungsi ini.

Berikut ialah beberapa fungsi panggil balik yang disediakan oleh Swoole:

  • onOpen: Fungsi panggil balik apabila sambungan WebSocket dibuka.
  • onMessage: Fungsi panggil balik apabila mesej WebSocket diterima.
  • onClose: Fungsi panggil balik apabila sambungan WebSocket ditutup.

Antaranya, fungsi onClose adalah fungsi utama untuk merealisasikan pemutusan dan penyambungan semula WebSocket.

Apabila sambungan antara klien dan pelayan ditutup, kami boleh melaksanakan logik pemotongan dan penyambungan semula dalam fungsi panggil balik acara onClose. Pelan pelaksanaan khusus adalah seperti berikut:

  1. Rekodkan pengecam unik sambungan (seperti nama pengguna, nombor peranti, dsb.).
  2. Tentukan sama ada sambungan ditutup kerana masalah rangkaian, penutupan pelanggan atau keabnormalan pelayan.
  3. Jika penutupan disebabkan oleh masalah rangkaian, kami boleh cuba menyambung semula dalam tempoh masa tertentu (biasanya beberapa saat).
  4. Jika kami masih tidak dapat menyambung, kami boleh mengambil beberapa tindakan, seperti menggesa pengguna, merekodkan log, dsb.

Pelaksanaan kod pemutusan dan penyambungan semula WebSocket

Berikut ialah contoh kod yang menunjukkan cara menggunakan Swoole untuk melaksanakan fungsi pemotongan dan penyambungan semula WebSocket:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9501);

$connections = array();

//连接开启时
$server->on('open', function ($server, $request) {
    echo "Client {$request->fd} connected
";
});

//接收到消息时
$server->on('message', function ($server, $frame) use (&$connections) {
    echo "Received message: {$frame->data}
";
});

//连接关闭时
$server->on('close', function ($server, $fd) use (&$connections) {
    echo "Connection {$fd} closed
";
    
    // 遍历所有连接,找到断开的连接的标识符,并删除记录
    foreach($connections as $key => $value){
        if($value == $fd){
            unset($connections[$key]);
        } 
    }
    
    // 重连
    swoole_timer_after(5000, function() use ($fd, &$connections){
        if (!in_array($fd, $connections)) {
            $connection = new swoole_http_client('127.0.0.1', 9501);
            $connection->upgrade('/', function ($client) use ($fd, &$connections){
                echo "Connection {$fd} reconnected
";
                $connections[$client->sock] = $fd;
            });
        }
    });
});

$server->start();

Dalam kod di atas, apabila sambungan ditutup, kami menggunakan fungsi swoole_timer_afteroole untuk melaksanakan fungsi pemotongan dan penyambungan semula. Fungsi ini menunjukkan bahawa fungsi panggil balik akan dilaksanakan selepas selang masa tertentu.

Operasi khusus adalah seperti berikut:

  1. Tentukan sama ada sambungan semasa direkodkan dalam tatasusunan $connections.
  2. Jika ia tidak dirakam, ini bermakna anda perlu menyambung semula Cipta objek swoole_http_client dan tetapkan IP dan port yang sepadan.
  3. Panggil kaedah naik taraf untuk merealisasikan sambungan protokol WebSocket. Apabila sambungan berjaya diwujudkan, kami merekodkan surat-menyurat antara deskriptor fail dan pengecam sambungan.

Melalui pelaksanaan ini, kita dapat merealisasikan fungsi pemutusan dan penyambungan semula WebSocket apabila persekitaran rangkaian tidak stabil.

Ringkasan

Dalam pembangunan web moden, WebSocket telah menjadi protokol penting. Walau bagaimanapun, persekitaran rangkaian yang tidak stabil atau sebab lain yang tidak diketahui boleh menyebabkan sambungan WebSocket terputus secara tidak normal, yang akan menyebabkan masalah kepada pembangun.

Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi yang menyokong protokol WebSocket dan menyediakan satu siri fungsi panggil balik acara yang membolehkan kami merealisasikan fungsi pemotongan dan penyambungan semula WebSocket. Melalui pengenalan artikel ini, saya berharap ia dapat membantu pembangun lebih memahami dan mengaplikasikan Swoole.

Atas ialah kandungan terperinci Bagaimana Swooole menyokong fungsi pemotongan dan penyambungan semula WebSocket. 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