php实现数据推送
PHP 实现数据推送的方法
使用 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实时数据推送。
安装 Ratchet(PHP WebSocket 库):
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('Data:', 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 fetchData(lastUpdate) {
fetch(`poll.php?lastUpdate=${lastUpdate}`)
.then(response => response.json())
.then(data => {
console.log('New data:', data);
fetchData(data.timestamp);
});
}
使用第三方服务(如 Pusher)
Pusher 提供了现成的实时消息推送服务。
安装 Pusher PHP SDK:
composer require pusher/pusher-php-server
PHP 推送代码:
$pusher = new Pusher\Pusher(
'key', 'secret', 'app_id', ['cluster' => 'mt1']
);
$pusher->trigger('channel', 'event', ['message' => 'Hello']);
客户端订阅(JavaScript):
const pusher = new Pusher('key', { cluster: 'mt1' });
const channel = pusher.subscribe('channel');
channel.bind('event', data => {
console.log('Received:', data);
});
性能与适用场景
- WebSocket:适合高频率、低延迟场景,需要维护持久连接。
- SSE:适合服务器到客户端的单向推送,实现简单。
- 长轮询:兼容性好,但会增加服务器负载。
- 第三方服务:快速实现,无需维护基础设施,可能有成本考虑。
根据具体需求选择合适的方法,WebSocket 和 SSE 适合现代浏览器应用,长轮询适合兼容旧浏览器,第三方服务适合快速开发。






