php实现推送功能实现
PHP 实现推送功能的方法
推送功能通常用于实时通知用户或客户端更新信息。以下是几种常见的 PHP 推送实现方式:
使用 WebSocket 实现实时推送
WebSocket 是一种全双工通信协议,适合实时推送场景。PHP 可以通过库如 Ratchet 实现 WebSocket 服务。
安装 Ratchet:
composer require cboden/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:', e.data);
};
使用 Server-Sent Events (SSE)
SSE 是一种基于 HTTP 的轻量级推送技术,适合单向实时数据推送。
PHP 服务端实现:

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);
}
客户端接收(JavaScript):
const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(e) {
console.log('Update:', e.data);
};
使用长轮询 (Long Polling)
长轮询是传统轮询的改进版,服务器在有数据时才响应。
PHP 实现:
$lastUpdate = $_GET['lastUpdate'] ?? 0;
while (true) {
$newData = checkForUpdates($lastUpdate);
if ($newData) {
echo json_encode($newData);
break;
}
sleep(1);
}
客户端请求:

function fetchUpdates(lastUpdate) {
fetch(`polling.php?lastUpdate=${lastUpdate}`)
.then(response => response.json())
.then(data => {
console.log('New data:', data);
fetchUpdates(data.timestamp);
});
}
使用第三方推送服务
对于移动应用推送,可以集成 Firebase Cloud Messaging (FCM) 或 Apple Push Notification Service (APNS)。
FCM 推送示例:
$url = 'https://fcm.googleapis.com/fcm/send';
$headers = [
'Authorization: key=YOUR_SERVER_KEY',
'Content-Type: application/json'
];
$data = [
'to' => '/topics/news',
'notification' => [
'title' => 'New Message',
'body' => 'You have a new notification'
]
];
$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);
使用消息队列
对于高并发场景,可以结合消息队列如 Redis Pub/Sub 或 RabbitMQ。
Redis Pub/Sub 示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->publish('channel', json_encode(['event' => 'update']));
订阅端:
$redis->subscribe(['channel'], function ($redis, $channel, $message) {
echo "Received: {$message}";
});
注意事项
- WebSocket 需要 PHP 常驻进程,建议用 Supervisor 管理
- SSE 和长轮询会占用服务器连接资源
- 第三方推送服务需要注册开发者账号
- 生产环境建议使用专业的消息队列系统
- 注意安全性,验证客户端身份和过滤推送内容






