php如何实现推送
PHP 实现推送的方法
PHP 可以通过多种方式实现推送功能,包括服务器推送、WebSocket 和第三方推送服务。以下是几种常见的实现方法:
使用 Server-Sent Events (SSE)
SSE 是一种基于 HTTP 的服务器推送技术,适用于单向实时通信场景。
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while (true) {
$data = json_encode(['time' => date('H:i:s')]);
echo "data: {$data}\n\n";
ob_flush();
flush();
sleep(1);
}
客户端通过 EventSource API 接收推送:
const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(e) {
console.log(e.data);
};
使用 WebSocket
WebSocket 提供全双工通信,适合需要双向交互的场景。PHP 需要配合 WebSocket 服务器实现。
使用 Ratchet 库创建 WebSocket 服务器:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
客户端连接示例:
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = function(e) {
console.log(e.data);
};
使用第三方推送服务
对于移动端推送,可以集成 Firebase Cloud Messaging (FCM) 或 Apple Push Notification Service (APNS)。
FCM 推送示例:
$url = 'https://fcm.googleapis.com/fcm/send';
$serverKey = 'YOUR_SERVER_KEY';
$headers = [
'Authorization: key=' . $serverKey,
'Content-Type: application/json'
];
$data = [
'to' => '/topics/all',
'notification' => [
'title' => 'Notification Title',
'body' => 'Notification Message'
]
];
$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);
使用长轮询 (Long Polling)
长轮询是传统 AJAX 轮询的改进版,服务器在有数据时才响应。
PHP 端实现:
$lastEventId = $_SERVER['HTTP_LAST_EVENT_ID'] ?? 0;
while ($lastEventId >= getLatestEventId()) {
usleep(100000); // 100ms
clearstatcache();
}
$data = getNewData($lastEventId);
header('Content-Type: application/json');
echo json_encode($data);
使用 MQTT 协议
MQTT 是轻量级的发布/订阅消息协议,适合 IoT 和移动应用。
PHP 使用 phpMQTT 库:
require('phpMQTT.php');
$mqtt = new phpMQTT('broker.example.com', 1883, 'phpClient');
if ($mqtt->connect()) {
$mqtt->publish('topic', 'message', 0);
$mqtt->close();
}
每种方法适用于不同场景:
- SSE:简单服务器推送
- WebSocket:双向实时通信
- 第三方服务:跨平台移动推送
- 长轮询:兼容性要求高的场景
- MQTT:物联网和低带宽环境
选择时需考虑浏览器支持、服务器资源和具体应用需求。







