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
Selepas pemasangan selesai, anda boleh menggunakan fungsi swoole_version()
dalam kod PHP untuk melihat maklumat versi Swoole untuk memastikan sambungan telah dipasang dengan betul.
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);
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.
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) { //处理关闭事件 });
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.
Selepas mendaftarkan fungsi panggil balik, kita boleh memulakan perkhidmatan ini:
$server->start();
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:
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') { //处理心跳响应 } });
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.
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); }
Selain itu, anda juga boleh menghantar mesej yang disasarkan kepada pelanggan tertentu berdasarkan maklumat sambungan pelanggan.
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); //处理数据 });
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, ]);
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!