php 的redis擴展是阻塞式 io ,使用訂閱/發布模式時,會導致整個進程進入阻塞。因此必須使用swooleredis異步客戶端來實現。
實例代碼
$server?=?new?swoole_websocket_server("0.0.0.0",?9501); $server->on('workerStart',?function?($server,?$workerId)?{ ????$client?=?new?swoole_redis; ????$client->on('message',?function?(swoole_redis?$client,?$result)?use?($server)?{ ????????if?($result[0]?==?'message')?{ ????????????foreach($server->connections?as?$fd)?{ ????????????????$server->push($fd,?$result[1]); ????????????} ????????} ????}); ????$client->connect('127.0.0.1',?6379,?function?(swoole_redis?$client,?$result)?{ ????????$client->subscribe('msg_0'); ????}); }); $server->on('open',?function?($server,?$request)?{ }); $server->on('message',?function?(swoole_websocket_server?$server,?$frame)?{ ????$server->push($frame->fd,?"hello"); }); $server->on('close',?function?($serv,?$fd)?{ }); $server->start();
實現過程
在進程啟動(onWorkerStart)時創建了SwooleRedis客戶端,連接到Redis服務器
連接成功后,訂閱msg_0主題的消息
當有新的message時,SwooleRedis會觸發onMessage事件回調
在這個回調函數中使用$server->connections遍歷服務器所有的連接,發送消息
相關推薦:《redis教程》
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END