Dengan pembangunan berterusan aplikasi web moden, komunikasi masa nyata telah menjadi salah satu fungsi yang diperlukan. Teknologi WebSocket ialah salah satu kaedah komunikasi masa nyata yang paling popular, yang boleh mewujudkan sambungan dua hala yang berterusan antara pelayan dan pelanggan untuk mencapai komunikasi masa nyata.
ThinkPHP ialah rangka kerja PHP yang sangat popular ThinkPHP 6 disertakan dengan pakej sambungan Swoole, menjadikannya sangat mudah untuk menggunakan teknologi WebSocket. Artikel ini akan memperkenalkan cara menggunakan rangka kerja ThinkPHP 6 untuk melaksanakan fungsi siaran WebSocket.
Sebelum bermula, anda perlu menyediakan persekitaran berikut:
Pertama, kita perlu mencipta projek baharu:
rreeeKemudian, untuk memudahkan daripada menggunakan WebSocket, kita perlu menambah sambungan Swoole dalam fail composer.json
projek:
composer create-project topthink/think my-project
Selepas selesai, jalankan arahan berikut untuk memasang:
"require": { "topthink/think-swoole": "^2.0", "swoole/swoole": "^4.7" }
Seterusnya, kita perlu mencipta pengawal untuk mengendalikan permintaan WebSocket. Cipta fail bernama app/controller
dalam direktori Websocket.php
dan tulis kod berikut:
composer install
Dalam kod di atas, kami mewarisi kelas thinkswooleWebsocket
dan menulis semula tiga daripadanya Kaedah:
onOpen
onMessage
onClose
Selepas pengawal dibuat, kita perlu mendaftarkannya dalam laluan. Tambahkan kandungan berikut dalam fail
:<?php declare(strict_types=1); namespace appcontroller; use thinkswooleWebsocket as SwooleWebsocket; use SwooleWebSocketFrame; class Websocket extends SwooleWebsocket { /** * 监听连接事件 * @param SwooleWebSocketServer $server * @param SwooleHttpRequest $request */ public function onOpen($server, $request) { } /** * 监听接收消息事件 * @param SwooleWebSocketServer $server * @param Frame $frame */ public function onMessage($server, Frame $frame) { } /** * 监听关闭事件 * @param SwooleWebSocketServer $server * @param int $fd */ public function onClose($server, $fd) { } }
digunakan di sini untuk mendaftarkan laluan. Kaedah permintaan laluan ini ialah app/route.php
, laluannya ialah
pengawal Route::post
. POST
/ws
Menulis logik komunikasi WebSocketWebsocket
onMessage
Kini, kami telah menyelesaikan penciptaan dan pendaftaran laluan dan pengawal WebSocket. Seterusnya, kita perlu menambah logik untuk komunikasi WebSocket dalam pengawal. Kami akan menggunakan pelayan WebSocket Swoole untuk melaksanakan komunikasi WebSocket.
, kita boleh mendapatkan mesej yang dihantar oleh pelanggan dan menyiarkan mesej ini kepada pelanggan lain. Dalam kaedah
, kita perlu mengalih keluar klien daripada kumpulan sambungan.onOpen
Buat fail bernama onMessage
dalam direktori onClose
dan tulis kod berikut:
use thinkacadeRoute; Route::post('/ws', 'Websocket@onMessage')->middleware( hinkmiddlewareAllowCrossDomain::class);
Konfigurasikan perkhidmatan WebSocket app/controller
WebSocketServer.php
Tulis kod perkhidmatan WebSocket Sebelum ini, kami memerlukan untuk mencipta fail konfigurasi bernama
<?php declare(strict_types=1); namespace appcontroller; use SwooleHttpResponse; use SwooleWebSocketFrame; use SwooleWebSocketServer; use thinkswoolewebsocketHandlerInterface; class WebSocketServer implements HandlerInterface { /** * @var array $connections */ private $connections = []; /** * 监听连接事件 * @param Server $server * @param SwooleHttpRequest $request */ public function onOpen(Server $server, SwooleHttpRequest $request): void { $this->connections[$request->fd] = $request->fd; echo "client-{$request->fd} is connected "; } /** * 监听消息事件 * @param Server $server * @param Frame $frame */ public function onMessage(Server $server, Frame $frame): void { foreach ($this->connections as $fd) { $info = $server->getClientInfo((int)$fd); if ($info && isset($info['websocket_status']) && $info['websocket_status'] == WEBSOCKET_STATUS_FRAME) { $server->push($fd, $frame->data); } else { unset($this->connections[$fd]); } } echo "received message from client-{$frame->fd}: {$frame->data} "; } /** * 监听关闭事件 * @param Server $server * @param int $fd * @param int $reactorId */ public function onClose(Server $server, int $fd, int $reactorId): void { unset($this->connections[$fd]); echo "client-{$fd} is closed "; } /** * @param Response $response */ public function onHandShake(Request $request, Response $response): bool { // Do nothing return true; } }
Dalam kod di atas, kami memberitahu aplikasi bagaimana untuk memulakan Swoole WebSocket melalui fail konfigurasi Serve. Kami memulakan jenis soket config
, mengikatnya pada swoole.php
dan mendayakan mod berbilang proses, menggunakan protokol TCP. Item konfigurasi
digunakan di sini untuk mengembalikan bilangan CPU sistem websocket
item konfigurasi menentukan kelas 0.0.0.0:9501
yang kami buat di atas. worker_num
swoole_cpu_num()
Jalankan perkhidmatan WebSocket handler
WebSocketServer
Selepas melengkapkan kod untuk mencipta dan mengkonfigurasi perkhidmatan WebSocket, kami perlu menjalankan kod untuk memulakan perkhidmatan WebSocket. Cuma laksanakan arahan berikut pada baris arahan:
return [ 'socket_type' => 'websocket', 'host' => '0.0.0.0', 'port' => 9501, 'mode' => SWOOLE_PROCESS, 'sock_type' => SWOOLE_SOCK_TCP, 'settings' => [ 'worker_num' => swoole_cpu_num(), ], 'handler' => ppcontrollerWebSocketServer::class, ];
ws://your-domain:9501/ws
Artikel ini memperkenalkan cara menggunakan rangka kerja ThinkPHP 6 untuk melaksanakan fungsi siaran WebSocket. Kami mencapai ini dengan mencipta pengawal, mendaftarkan laluan dan menulis logik komunikasi WebSocket, dan mengkonfigurasi perkhidmatan WebSocket. Contoh ini boleh digunakan sebagai amalan terbaik WebSocket yang mudah dan menyediakan rujukan untuk kami membangunkan fungsi WebSocket yang lebih maju.
Atas ialah kandungan terperinci Melaksanakan siaran Websocket menggunakan ThinkPHP6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!