php实现推送功能实现原理
PHP 推送功能实现原理
PHP 实现推送功能通常涉及服务器与客户端之间的实时通信。以下是几种常见的实现方式及其原理:
轮询(Polling)
客户端定期向服务器发送请求,检查是否有新数据。服务器在收到请求后立即响应,无论是否有新数据。

// 服务器端示例
$lastUpdate = $_GET['last_update'];
$newData = checkForNewData($lastUpdate);
if ($newData) {
echo json_encode($newData);
} else {
echo json_encode([]);
}
长轮询(Long Polling)
客户端发送请求后,服务器保持连接打开,直到有新数据或超时。客户端收到响应后立即发送新请求。
// 服务器端示例
$timeout = 30; // 超时时间(秒)
$startTime = time();
while (time() - $startTime < $timeout) {
$newData = checkForNewData();
if ($newData) {
echo json_encode($newData);
break;
}
sleep(1); // 避免CPU过载
}
WebSocket
WebSocket 提供全双工通信通道,服务器可以主动推送数据到客户端。PHP 通常借助 Ratchet 等库实现。

// Ratchet 服务器端示例
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
class MyWebSocket implements MessageComponentInterface {
public function onMessage(ConnectionInterface $conn, $msg) {
$conn->send("Received: " . $msg);
}
}
$server = IoServer::factory(
new HttpServer(new WsServer(new MyWebSocket())),
8080
);
$server->run();
Server-Sent Events (SSE)
客户端通过 EventSource API 订阅服务器事件流,服务器通过 HTTP 响应推送数据。
// 服务器端示例
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
$newData = checkForNewData();
if ($newData) {
echo "data: " . json_encode($newData) . "\n\n";
ob_flush();
flush();
}
sleep(1);
}
第三方推送服务
使用 Firebase Cloud Messaging (FCM) 或 Pusher 等第三方服务简化推送实现。
// FCM 推送示例
$url = 'https://fcm.googleapis.com/fcm/send';
$data = [
'to' => '/topics/news',
'data' => ['message' => 'New update available']
];
$options = [
'http' => [
'header' => "Authorization: key=YOUR_API_KEY\r\nContent-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data)
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
实现选择建议
- 简单场景:使用 SSE 或长轮询,实现成本低。
- 高实时性需求:WebSocket 提供最佳性能,但需要额外库支持。
- 移动端推送:优先考虑 FCM 等第三方服务。
- 兼容性要求:轮询兼容性最好,但效率最低。
每种方法各有优劣,需根据具体场景选择。WebSocket 和 SSE 是现代 Web 应用中更高效的解决方案。






