1. 程式人生 > >如何實現從 Redis 中訂閱消息轉發到 WebSocket 客戶端

如何實現從 Redis 中訂閱消息轉發到 WebSocket 客戶端

模式 func pen subscribe ssa ole ade 連接 回調函數

PHP 的redis擴展是阻塞式 IO ,使用訂閱/發布模式時,會導致整個進程進入阻塞。因此必須使用Swoole\Redis異步客戶端來實現。

實例代碼

 1 $server = new swoole_websocket_server("0.0.0.0", 9501);
 2 
 3 $server->on(‘workerStart‘, function ($server, $workerId) {
 4     $client = new swoole_redis;
 5     $client->on(‘message‘, function (swoole_redis $client, $result
) use ($server) { 6 if ($result[0] == ‘message‘) { 7 foreach($server->connections as $fd) { 8 $server->push($fd, $result[1]); 9 } 10 } 11 }); 12 $client->connect(‘127.0.0.1‘, 6379, function (swoole_redis $client, $result) { 13 $client
->subscribe(‘msg_0‘); 14 }); 15 }); 16 17 $server->on(‘open‘, function ($server, $request) { 18 19 }); 20 21 $server->on(‘message‘, function (swoole_websocket_server $server, $frame) { 22 $server->push($frame->fd, "hello"); 23 }); 24 25 $server->on(‘close‘, function ($serv
, $fd) { 26 27 }); 28 29 $server->start();

實現過程

  • 在進程啟動(onWorkerStart)時創建了Swoole\Redis客戶端,連接到Redis服務器

  • 連接成功後,訂閱msg_0主題的消息

  • 當有新的message時,Swoole\Redis會觸發onMessage事件回調

  • 在這個回調函數中使用$server->connections遍歷服務器所有的連接,發送消息

如何實現從 Redis 中訂閱消息轉發到 WebSocket 客戶端