Rumah > rangka kerja php > Swoole > teks badan

Pengalaman pembangunan pelayan WebSocket berprestasi tinggi berdasarkan Swoole

WBOY
Lepaskan: 2023-06-14 11:48:02
asal
850 orang telah melayarinya

Websocket ialah protokol komunikasi dupleks penuh berdasarkan TCP, yang membolehkan pelanggan dan pelayan berinteraksi dengan data dalam masa nyata. Protokol Websocket sesuai untuk senario aplikasi seperti penghantaran data masa nyata dan permainan dalam talian Tidak seperti protokol HTTP, Websocket boleh mengekalkan sambungan yang panjang, mengelakkan kelemahan protokol HTTP yang memerlukan penubuhan sambungan TCP untuk setiap permintaan. . Oleh itu, semakin banyak produk menggunakan protokol Websocket untuk penghantaran data.

Untuk meningkatkan prestasi pelayan Websocket, kami boleh menggunakan sambungan Swoole untuk pembangunan. Swoole ialah rangka kerja komunikasi rangkaian PHP berprestasi tinggi yang biasa digunakan. Ia berdasarkan model dipacu peristiwa tak segerak dan melaksanakan coroutine yang biasa digunakan dalam rangka kerja berprestasi tinggi seperti React dan Node.js, yang meningkatkan prestasi PHP dengan ketara. Dalam artikel ini, kami akan memperkenalkan cara untuk membangunkan pelayan Websocket berprestasi tinggi di bawah Swoole dan berkongsi beberapa pengalaman berkaitan.

1. Mulakan perkhidmatan Swoole

Sebelum memulakan perkhidmatan Swoole, kita perlu memasang sambungan Swoole terlebih dahulu. Swoole menyokong sistem pengendalian biasa seperti Windows, Linux, macOS, dll. Kami boleh menggunakan arahan pecl untuk memasang sambungan, atau memuat turun kod sumber daripada tapak web rasmi Swoole untuk penyusunan dan pemasangan. Di sini kita mengambil pemasangan arahan pecl sebagai contoh:

pecl install swoole
Salin selepas log masuk

Selepas pemasangan selesai, anda boleh menggunakan fungsi swoole_version() dalam kod PHP untuk melihat maklumat versi Swoole untuk memastikan sambungan telah dipasang dengan betul.

  1. Cipta contoh perkhidmatan

Sebelum menggunakan Swoole untuk membangunkan pelayan Websocket, anda perlu mencipta contoh perkhidmatan Kami boleh menggunakan kelas SwooleWebSocketServer yang disediakan oleh Swole untuk menciptanya, seperti berikut :

$server = new SwooleWebSocketServer('0.0.0.0', 9501);
Salin selepas log masuk

Antaranya, 0.0.0.0 bermaksud mendengar pada semua alamat IP yang tersedia dan 9501 bermaksud nombor port mendengar. Selepas mencipta contoh, kami boleh melakukan beberapa konfigurasi pada pelayan, seperti menetapkan bilangan proses pekerja, menetapkan mod pengendalian, mendayakan protokol TCP, dll. Untuk butiran, sila rujuk dokumentasi rasmi Swoole.

  1. Daftar fungsi panggil balik acara

Komunikasi antara pelayan Websocket dan klien dicapai melalui fungsi panggil balik acara Kami perlu mendaftarkan fungsi panggil balik dalam contoh perkhidmatan supaya contoh perkhidmatan Mampu bertindak balas terhadap peristiwa yang sesuai. Swoole menyediakan banyak fungsi panggil balik (seperti onMessage, onOpen, onClose, onRequest, onHandShake, dll. Apabila kami membangunkan pelayan Websocket, kami biasanya perlu mendaftarkan tiga fungsi panggil balik berikut:

//连接成功时触发
$server->on('open', function (SwooleWebSocketServer $server, $request) {
    //处理连接事件
});

//收到客户端消息时触发
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    //处理消息事件
});

//连接关闭时触发
$server->on('close', function (SwooleWebSocketServer $server, $fd) {
    //处理关闭事件
});
Salin selepas log masuk

Antaranya, acara terbuka berada di sebelah klien Selepas sambungan berjaya diwujudkan, acara mesej dicetuskan selepas klien menghantar mesej, dan acara tutup dicetuskan selepas sambungan ditutup. Dalam Swoole, objek $frame mewakili badan data mesej WebSocket dan kandungan khusus mesej itu boleh diperolehi melalui $frame->data.

  1. Mulakan perkhidmatan

Selepas mendaftarkan fungsi panggil balik, kita boleh memulakan perkhidmatan ini:

$server->start();
Salin selepas log masuk

Apabila memulakan perkhidmatan , ia akan dibuat secara automatik Proses pekerja dan benang reaktor digunakan untuk mengendalikan proses perniagaan seperti sambungan pelanggan dan penghantaran mesej.

2. Pengalaman pembangunan perkhidmatan Websocket

Apabila menggunakan Swoole untuk membangunkan pelayan Websocket, anda juga perlu memberi perhatian kepada aspek berikut:

  1. Mekanisme degupan jantung

Protokol Websocket tidak mempunyai permintaan dan respons yang jelas dalam protokol HTTP, tetapi menggunakan push mesej untuk penghantaran data masa nyata. Memandangkan pelayan Websocket perlu memantau sambungan pelanggan dan penghantaran mesej untuk masa yang lama, ia tidak boleh menghantar mesej apabila pelanggan memutuskan sambungan Oleh itu, kami perlu melaksanakan mekanisme degupan jantung dan menghantar permintaan degupan jantung kepada klien dengan kerap untuk mengekalkan sambungan. Dalam Swoole, kita boleh menggunakan ping dan pong mesej untuk melaksanakan mekanisme degupan jantung.

//心跳包
$server->tick(30000, function () use ($server) {
    foreach ($server->connections as $fd) {
        $server->push($fd, json_encode(['type' => 'ping']));
    }
});

//心跳响应
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    if ($frame->data == 'pong') {
        //处理心跳响应
    }
});
Salin selepas log masuk

Antaranya, fungsi tick boleh menghantar permintaan degupan jantung kepada pelanggan dengan kerap, dan fungsi panggil balik onMessage boleh memproses tindak balas degupan jantung pelanggan untuk memastikan pelanggan mengekalkan sambungan dengan pelayan.

  1. Siaran Mesej

Senario yang sangat biasa untuk pelayan Websocket ialah menyiarkan mesej kepada semua pelanggan, seperti rentak, permainan berbilang pemain, dsb. Dalam Swoole, kita boleh menggunakan kaedah push untuk menyiarkan mesej.

//处理广播消息
$message = 'Hello, everyone!';
foreach ($server->connections as $fd) {
    $server->push($fd, $message);
}
Salin selepas log masuk

Selain itu, anda juga boleh menghantar mesej yang disasarkan kepada pelanggan tertentu berdasarkan maklumat sambungan pelanggan.

  1. Pemformatan data

Dalam protokol Websocket, data yang dikomunikasikan antara klien dan pelayan mungkin dihantar dalam JSON, XML dan format lain, jadi apabila memproses yang diterima data , kita perlu memformat data, seperti menggunakan json_decode untuk menghuraikan format JSON.

//处理消息事件
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    $data = json_decode($frame->data, true);
    //处理数据
});
Salin selepas log masuk
  1. Pengurusan berbilang proses

Dalam pelayan Websocket, akan terdapat sejumlah besar permintaan pelanggan Untuk meningkatkan keupayaan pemprosesan pelayan, kami boleh menggunakan Ciri pengurusan pelbagai proses Swoole. Swoole menyokong proses Induk dan berbilang proses Pekerja Proses Induk digunakan untuk mengurus proses Pekerja, dan proses Pekerja bertanggungjawab untuk memproses permintaan pelanggan tertentu. Kami boleh menetapkan bilangan proses Pekerja apabila membuat contoh perkhidmatan untuk menyesuaikan diri dengan permintaan beban saiz yang berbeza.

$server->set([
    'worker_num' => 4,
]);
Salin selepas log masuk

Dalam persekitaran berbilang proses, anda perlu memberi perhatian kepada isu penyegerakan dan perkongsian data Anda boleh menggunakan Proses, Jadual, Atom, Mutex dan komponen lain yang disediakan oleh Swoole untuk mencapai komunikasi dan penyegerakan antara proses. .

Ringkasnya, menggunakan Swoole untuk membangunkan pelayan Websocket boleh meningkatkan prestasi dan kestabilan pelayan dengan sangat baik. Ia juga memerlukan kita mahir dalam ciri berkaitan dan kemahiran pembangunan Swoole. Saya harap artikel ini dapat membantu pembangun dan menyediakan rujukan untuk pelaksanaan pelayan Websocket berprestasi tinggi yang lebih baik.

Atas ialah kandungan terperinci Pengalaman pembangunan pelayan WebSocket berprestasi tinggi berdasarkan Swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan