php如何实现push
PHP 实现 Push 功能的方法
PHP 实现 Push 功能通常指服务器向客户端推送消息,常见场景包括实时通知、聊天应用等。以下是几种实现方式:
使用 WebSocket
WebSocket 是一种全双工通信协议,适合实时推送。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');
while (true) {
$data = json_encode(['time' => date('H:i:s')]);
echo "data: {$data}\n\n";
ob_flush();
flush();
sleep(1);
}
客户端监听事件:
const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(e) {
console.log('Data:', e.data);
};
使用长轮询 (Long Polling)
长轮询通过保持 HTTP 连接模拟推送效果。
PHP 服务端代码:

$timeout = 30;
$start = time();
while (time() - $start < $timeout) {
if (hasNewData()) {
echo json_encode(getNewData());
exit;
}
usleep(100000); // 0.1秒
}
echo json_encode([]);
客户端发起请求:
function poll() {
fetch('poll.php')
.then(response => response.json())
.then(data => {
if (data.length) console.log('New data:', data);
poll();
});
}
poll();
使用第三方推送服务
Firebase Cloud Messaging (FCM) 或 Pusher 等第三方服务提供成熟的推送解决方案。
PHP 集成 Pusher 示例:
$pusher = new Pusher\Pusher(
'APP_KEY', 'APP_SECRET', 'APP_ID',
['cluster' => 'APP_CLUSTER']
);
$pusher->trigger('channel', 'event', ['message' => 'Hello']);
客户端订阅:
const pusher = new Pusher('APP_KEY', { cluster: 'APP_CLUSTER' });
const channel = pusher.subscribe('channel');
channel.bind('event', data => {
console.log('Received:', data.message);
});
注意事项
- WebSocket 需要 PHP 常驻进程,适合专用服务器环境。
- SSE 和长轮询对服务器资源消耗较高,需合理设置超时时间。
- 第三方服务需注册账号并获取 API 密钥,适合快速集成。
根据项目需求选择合适的方式,WebSocket 适合高实时性场景,SSE 和长轮询适合简单需求,第三方服务适合快速开发。






