php实现推送功能实现原理
PHP 推送功能实现原理
PHP 推送功能通常涉及服务器向客户端实时或准实时传递数据,常见于聊天应用、通知系统等场景。以下是几种常见的实现方式:
短轮询(Short Polling)
客户端定期向服务器发送请求,服务器立即返回响应。如果服务器有新数据,返回数据;否则返回空响应。
// 服务器端示例
$hasNewData = checkForNewData(); // 检查是否有新数据
if ($hasNewData) {
echo json_encode(['data' => $newData]);
} else {
echo json_encode(['data' => null]);
}
短轮询实现简单,但频繁请求会增加服务器负担。

长轮询(Long Polling)
客户端发送请求后,服务器保持连接打开直到有新数据或超时。减少不必要的请求,但服务器需要维护更多连接。
// 服务器端示例
$timeout = 30; // 超时时间(秒)
$startTime = time();
while (time() - $startTime < $timeout) {
$hasNewData = checkForNewData();
if ($hasNewData) {
echo json_encode(['data' => $newData]);
break;
}
usleep(100000); // 避免CPU占用过高
}
WebSocket
WebSocket 提供全双工通信,适合高实时性场景。PHP 可通过 Ratchet 等库实现 WebSocket 服务器。

// Ratchet 示例
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class MyChat implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
// 新连接逻辑
}
public function onMessage(ConnectionInterface $from, $msg) {
// 处理消息
}
public function onClose(ConnectionInterface $conn) {
// 连接关闭逻辑
}
public function onError(ConnectionInterface $conn, \Exception $e) {
// 错误处理
}
}
$server = \Ratchet\Server\IoServer::factory(
new \Ratchet\Http\HttpServer(
new \Ratchet\WebSocket\WsServer(
new MyChat()
)
),
8080
);
$server->run();
Server-Sent Events (SSE)
SSE 允许服务器通过 HTTP 连接向客户端推送数据。客户端通过 EventSource API 接收数据。
// 服务器端示例
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while (true) {
$newData = getNewData();
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';
$headers = [
'Authorization: key=YOUR_SERVER_KEY',
'Content-Type: application/json'
];
$data = [
'to' => 'DEVICE_TOKEN',
'notification' => [
'title' => 'Title',
'body' => 'Message body'
]
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($ch);
curl_close($ch);
选择建议
- 简单场景:短轮询或长轮询
- 高实时性:WebSocket 或 SSE
- 无服务器资源:第三方推送服务
每种方式各有优缺点,需根据具体需求选择。






