php实现推送消息推送消息
PHP 实现消息推送的方法
使用 WebSocket 实现实时推送
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。
在 PHP 中可以通过 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();
客户端 JavaScript 连接代码:
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = function(e) {
console.log('Message received: ', e.data);
};
使用 Server-Sent Events (SSE)
SSE 是 HTML5 规范中的一部分,允许服务器向客户端推送数据:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while(true) {
$data = getNewData(); // 获取新数据
echo "data: " . json_encode($data) . "\n\n";
ob_flush();
flush();
sleep(1);
}
客户端接收代码:

const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(e) {
console.log('New message: ', 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' => 'New Message',
'body' => 'You have a new 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);
使用长轮询技术
长轮询是传统轮询的改进版,服务器在有数据时才响应:
// 服务器端
$lastEventId = $_SERVER['HTTP_LAST_EVENT_ID'] ?? 0;
while(true) {
$newData = checkForNewData($lastEventId);
if($newData) {
echo json_encode($newData);
break;
}
usleep(500000); // 等待0.5秒
}
使用消息队列系统
对于大规模应用,可以结合 RabbitMQ 或 Redis 实现消息推送:
Redis 发布/订阅示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 发布消息
$redis->publish('notification_channel', json_encode([
'user_id' => 123,
'message' => 'New notification'
]));
// 订阅端需要常驻运行
$redis->subscribe(['notification_channel'], function($redis, $channel, $message) {
processNotification($message);
});






