php实现即时更新
PHP 实现即时更新
使用 AJAX 轮询
通过 JavaScript 定时发送 AJAX 请求到 PHP 后端,检查是否有新数据更新。这种方法简单但会增加服务器负载。
客户端代码示例:
function pollUpdates() {
setInterval(function() {
fetch('check_updates.php')
.then(response => response.json())
.then(data => {
if (data.updated) {
// 更新页面内容
}
});
}, 5000); // 每5秒轮询一次
}
PHP 后端示例 (check_updates.php):
<?php
$lastUpdateTime = /* 从数据库获取最后更新时间 */;
$currentTime = time();
header('Content-Type: application/json');
echo json_encode(['updated' => ($currentTime - $lastUpdateTime) < 5]);
?>
WebSocket 实现
WebSocket 提供全双工通信通道,适合需要高实时性的场景。
PHP 可以使用 Ratchet 库实现 WebSocket 服务器:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class UpdateServer implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {}
public function onClose(ConnectionInterface $conn) {}
public function onError(ConnectionInterface $conn, \Exception $e) {}
public function onMessage(ConnectionInterface $from, $msg) {
// 处理消息并广播更新
}
}
$app = new Ratchet\App('localhost', 8080);
$app->route('/updates', new UpdateServer);
$app->run();
客户端连接代码:
const socket = new WebSocket('ws://localhost:8080/updates');
socket.onmessage = function(event) {
// 处理实时更新
};
Server-Sent Events (SSE)
SSE 是 HTML5 标准,允许服务器推送更新到客户端,适合单向实时通信场景。
PHP 实现示例:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
$newData = /* 检查新数据 */;
if ($newData) {
echo "data: " . json_encode($newData) . "\n\n";
ob_flush();
flush();
}
sleep(1);
}
?>
客户端代码:
const eventSource = new EventSource('sse_updates.php');
eventSource.onmessage = function(e) {
// 处理推送的数据
};
长轮询 (Long Polling)
客户端发送请求后,服务器保持连接开放直到有新数据或超时,比常规轮询更高效。
PHP 实现示例:
<?php
$timeout = 30; // 超时时间(秒)
$startTime = time();
while (time() - $startTime < $timeout) {
$updates = /* 检查更新 */;
if (!empty($updates)) {
echo json_encode($updates);
exit;
}
usleep(100000); // 微秒延迟
}
echo json_encode([]);
?>
数据库触发通知
某些数据库如 MySQL 可以设置触发器,配合 PHP 实现实时通知。
MySQL 触发器示例:
DELIMITER //
CREATE TRIGGER after_update_notify
AFTER UPDATE ON your_table
FOR EACH ROW
BEGIN
INSERT INTO notifications (message) VALUES ('Table updated');
END //
DELIMITER ;
PHP 检查通知:
$pdo = new PDO(/* 连接信息 */);
$stmt = $pdo->prepare("SELECT * FROM notifications");
$stmt->execute();
$notifications = $stmt->fetchAll();
使用 Redis 发布/订阅
Redis 的 pub/sub 功能适合构建实时通知系统。
PHP 订阅示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->subscribe(['updates_channel'], function($redis, $channel, $msg) {
// 处理接收到的消息
});
发布更新示例:
$redis->publish('updates_channel', json_encode($updateData));
每种方法各有优缺点,选择时应考虑应用场景、服务器资源和实时性要求。AJAX 轮询适合简单场景,WebSocket 适合高交互应用,SSE 适合服务器推送场景,长轮询是轮询的优化版,数据库通知和 Redis 适合特定架构需求。







