php实现轮询
PHP 实现轮询的方法
轮询(Polling)是一种客户端定期向服务器发送请求以获取最新数据的技术。以下是几种常见的 PHP 轮询实现方式:
使用 AJAX 定时请求
前端通过 JavaScript 定时发送 AJAX 请求到 PHP 后端,后端返回最新数据。

// 前端 JavaScript 代码
function pollServer() {
fetch('poll.php')
.then(response => response.json())
.then(data => {
console.log(data);
setTimeout(pollServer, 3000); // 3秒后再次轮询
});
}
pollServer();
// 后端 PHP 代码 (poll.php)
<?php
header('Content-Type: application/json');
$data = ['message' => 'Latest data'];
echo json_encode($data);
?>
使用长轮询(Long Polling)
长轮询是轮询的改进版,服务器在有数据更新时才返回响应,减少不必要的请求。

// 后端 PHP 代码 (long_poll.php)
<?php
header('Content-Type: application/json');
$timeout = 30; // 超时时间(秒)
$startTime = time();
while (true) {
// 检查是否有新数据
if (hasNewData()) {
echo json_encode(['message' => 'New data']);
break;
}
// 检查超时
if (time() - $startTime >= $timeout) {
echo json_encode(['message' => 'Timeout']);
break;
}
sleep(1); // 避免 CPU 过载
}
function hasNewData() {
// 模拟数据更新检查
return rand(0, 10) > 8;
}
?>
使用 WebSocket
WebSocket 提供全双工通信,比轮询更高效,但需要服务器支持。
// 使用 Ratchet 库实现 WebSocket 服务器
// 安装 Ratchet: composer require cboden/ratchet
<?php
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();
?>
使用 Server-Sent Events (SSE)
SSE 允许服务器主动推送数据到客户端,适合单向数据流场景。
// 后端 PHP 代码 (sse.php)
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
while (true) {
$data = ['time' => date('H:i:s')];
echo "data: " . json_encode($data) . "\n\n";
ob_flush();
flush();
sleep(1);
}
?>
选择建议
- 简单轮询:适合数据更新不频繁的场景,实现简单。
- 长轮询:减少无效请求,适合中等频率更新。
- WebSocket:适合高频、双向通信,但实现复杂。
- SSE:适合服务器向客户端单向推送数据。
根据具体需求选择合适的技术方案。






