php推送怎么实现
PHP 实现推送的方法
使用 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();
客户端连接示例:
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');
header('Connection: keep-alive');
while (true) {
echo "data: " . json_encode(['time' => date('H:i:s')]) . "\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 服务端:

$data = getNewData(); // 获取新数据
if ($data) {
echo json_encode($data);
exit;
}
// 无数据时等待
sleep(10);
客户端 AJAX 请求:
function fetchData() {
$.ajax({
url: 'polling.php',
success: function(data) {
console.log('Data:', data);
fetchData(); // 递归调用
}
});
}
使用第三方推送服务
对于高并发场景,可考虑第三方服务如:
- Firebase Cloud Messaging (FCM)
- Pusher
- PubNub
以 Pusher 为例:
$pusher = new Pusher\Pusher(
'APP_KEY',
'APP_SECRET',
'APP_ID',
['cluster' => 'APP_CLUSTER']
);
$pusher->trigger('channel', 'event', ['message' => 'Hello']);
数据库驱动推送
通过定期检查数据库变化实现推送:
$lastId = $_GET['last_id'] ?? 0;
$stmt = $pdo->prepare("SELECT * FROM messages WHERE id > ?");
$stmt->execute([$lastId]);
$messages = $stmt->fetchAll();
if (!empty($messages)) {
echo json_encode($messages);
}
注意事项
- WebSocket 需要 PHP 常驻内存,建议用 Supervisor 管理进程
- SSE 和长轮询会占用服务器连接资源
- 第三方服务通常有免费额度限制
- 生产环境建议使用专业的消息队列系统如 Redis Pub/Sub






