PHP实现消息广播
PHP实现消息广播的方法
使用WebSocket实现实时广播
WebSocket是实现实时消息广播的高效方式。PHP可通过Ratchet库实现WebSocket服务器:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
class Broadcast implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
$client->send($msg);
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(new WsServer(new Broadcast())),
8080
);
$server->run();
客户端使用JavaScript连接:

const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = function(e) {
console.log('Received: ' + e.data);
};
使用Redis发布/订阅模式
Redis的Pub/Sub功能适合分布式系统的消息广播:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 订阅频道
$redis->subscribe(['channel_name'], function($redis, $channel, $message) {
echo "Received: {$message}\n";
});
// 发布消息
$redis->publish('channel_name', 'Broadcast message');
使用Server-Sent Events (SSE)
SSE是单向服务器推送技术,适合简单广播场景:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true) {
$data = json_encode(['time' => date('H:i:s')]);
echo "data: {$data}\n\n";
ob_flush();
flush();
sleep(1);
}
客户端接收:
const evtSource = new EventSource("sse.php");
evtSource.onmessage = function(e) {
console.log(e.data);
};
数据库轮询方案
对于传统应用,可通过数据库表实现消息队列:
// 发送端
$db->query("INSERT INTO messages (content) VALUES ('Broadcast content')");
// 接收端
$lastId = 0;
while(true) {
$result = $db->query("SELECT * FROM messages WHERE id > $lastId");
while($row = $result->fetch()) {
processMessage($row['content']);
$lastId = $row['id'];
}
sleep(1);
}
性能优化建议
- WebSocket方案需配合Nginx反向代理处理高并发
- Redis方案注意配置持久化防止消息丢失
- 生产环境建议使用专业的消息队列系统如RabbitMQ
- 考虑使用OPCache加速PHP执行效率






