用PHP实现持续监听Redis订阅并将消息推送至前端的技术

搭建WebSocket服务器

首先选择一个PHP WebSocket库,一般而言 Ratchet 和 Swoole 是两个非常受欢迎的选择。

以Ratchet为例,它是一个PHP WebSocket库,可以非常方便的创建WebSocket服务器。

// Ratchet WebSocket服务器示例
require dirname(__DIR__) . '/vendor/autoload.php';
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use YourApp\WebSocketController;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new WebSocketController()
        )
    ),
    8080
);

$server->run();

其中 WebSocketController 是你定义的一个控制器,负责处理WebSocket连接的业务逻辑。

实现Redis订阅逻辑

在WebSocket服务器的后台运行一个PHP脚本来监听Redis通道的消息。

// PHP脚本用来监听Redis订阅
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->subscribe(['channel-name'], function($redis, $chan, $msg) {
    // 将消息推送到WebSocket服务器
});

消息队列处理

创建一个循环,不断地检查Redis是否有新的消息,一但检测到就推送到WebSocket服务器。

while (true) {
    $message = $redis->brPop('websocket_queue', 0);
    if ($message) {
        // 推送到WebSocket客户端
    }
}

这里使用了阻塞式弹出 brPop,保持脚本运行不退出,实时监听和处理队列。

前端实现

HTML的JavaScript部分,连接WebSocket服务器并接收消息。

// 使用WebSocket与服务器建立连接
var conn = new WebSocket('ws://localhost:8080');

// 连接开启时的事件
conn.onopen = function(e) {
    console.log("连接服务器成功!");
};

// 接收到服务器发送的消息
conn.onmessage = function(e) {
    console.log(e.data); // 这里可以根据需要处理消息
};

心跳机制

在WebSocket服务器和客户端JavaScript中实现心跳检测。

// WebSocket服务器端示例 - Pseudo Code
$clients->forEach(function($client) {
  if ($client->isNotActive()) {
    $client->close(); // 关闭非活跃连接
  }
  else {
    $client->send("ping"); // 发送心跳
  }
});

// 客户端JavaScript示例
conn.onmessage = function(e) {
    if (e.data === "ping") {
        conn.send("pong"); // 响应心跳
    }
};
posted @ 2025-09-06 18:04  晃悠人生  阅读(17)  评论(0)    收藏  举报