php实现网页推送
PHP 实现网页推送的方法
使用 WebSocket 实现实时推送
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时推送功能。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 允许服务器向客户端推送事件流,适用于单向实时通信场景。
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 = checkForNewData($lastUpdate);
if ($newData) {
echo json_encode($newData);
break;
}
sleep(1);
}
客户端代码(JavaScript):
function poll() {
fetch('poll.php?lastUpdate=' + lastUpdate)
.then(response => response.json())
.then(data => {
console.log('New data:', data);
poll();
});
}
poll();
使用第三方推送服务
Firebase Cloud Messaging (FCM) 或 Pusher 等第三方服务提供成熟的推送解决方案。
PHP 集成 Pusher 示例:
require __DIR__ . '/vendor/autoload.php';
$pusher = new Pusher\Pusher(
'APP_KEY',
'APP_SECRET',
'APP_ID',
['cluster' => 'APP_CLUSTER']
);
$pusher->trigger('my-channel', 'my-event', ['message' => 'Hello!']);
客户端监听(JavaScript):
const pusher = new Pusher('APP_KEY', { cluster: 'APP_CLUSTER' });
const channel = pusher.subscribe('my-channel');
channel.bind('my-event', data => {
console.log('Received:', data.message);
});
注意事项
- WebSocket 和 SSE 需要服务器支持,共享主机可能无法使用。
- 长轮询会增加服务器负载,不适合高并发场景。
- 第三方服务通常有免费额度,超出后可能产生费用。
- 所有方法都应考虑安全性,如验证用户权限、防止 CSRF 攻击等。







