PHP轮询实现
轮询的基本概念
轮询是一种客户端定期向服务器发送请求以获取最新数据的技术。适用于需要实时更新但无法使用WebSocket或Server-Sent Events (SSE)的场景。
简单轮询实现
通过JavaScript的setInterval定时发送AJAX请求到PHP后端:
// 前端代码
setInterval(function() {
fetch('poll.php')
.then(response => response.json())
.then(data => console.log(data));
}, 3000); // 每3秒请求一次
PHP后端返回数据示例:
// poll.php
<?php
header('Content-Type: application/json');
echo json_encode(['time' => time(), 'data' => 'New content']);
?>
长轮询优化
长轮询通过保持连接直到数据更新,减少无效请求。PHP需结合循环与超时控制:
// long_poll.php
<?php
header('Content-Type: application/json');
$timeout = 20; // 超时时间(秒)
$startTime = time();
while (true) {
// 检查数据是否更新(示例逻辑)
if (dataHasChanged()) {
echo json_encode(['data' => 'Updated content']);
break;
}
if (time() - $startTime > $timeout) {
echo json_encode(['data' => 'Timeout']);
break;
}
sleep(1); // 避免CPU过载
}
function dataHasChanged() {
// 实际业务中替换为数据库或缓存检查
return rand(0, 10) > 8; // 模拟随机更新
}
?>
性能优化建议
- 缓存检查:使用Redis或Memcached存储最新数据标识,减少数据库查询。
- 连接复用:HTTP/2支持多路复用,降低轮询开销。
- 退避策略:动态调整轮询间隔(如指数退避)。
替代方案对比
- WebSocket:全双工通信,适合高频更新场景。
- SSE:服务器单向推送,兼容性良好。
轮询适用于简单场景,但需权衡服务器负载与实时性需求。







