
PHP 的redis扩展是阻塞式 IO ,使用订阅/发布模式时,会导致整个进程进入阻塞。因此必须使用Swoole\Redis异步客户端来实现。
实例代码
$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)时创建了Swoole\Redis客户端,连接到Redis服务器
连接成功后,订阅msg_0主题的消息
当有新的message时,Swoole\Redis会触发onMessage事件回调
在这个回调函数中使用$server->connections遍历服务器所有的连接,发送消息
相关推荐:《redis教程》
Atas ialah kandungan terperinci 实现从Redis中订阅消息转发到 WebSocket 客户端. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Perisian pangkalan data yang biasa digunakan
Apakah pangkalan data dalam memori?
Yang manakah mempunyai kelajuan bacaan yang lebih pantas, mongodb atau redis?
Cara menggunakan redis sebagai pelayan cache
Bagaimana redis menyelesaikan ketekalan data
Bagaimanakah mysql dan redis memastikan konsistensi penulisan dua kali?
Apakah data yang biasanya disimpan oleh redis cache?
Apakah 8 jenis data redis