php 8.2 本身不内置 websocket 服务端能力,需依赖 workerman 或 swoole 等常驻框架实现;核心是启动监听服务、处理连接/消息/关闭事件、支持广播或定向推送,并配合前端 websocket api 完成实时通信。

PHP 8.2 本身不内置 WebSocket 服务端能力,但可以高效、稳定地通过常驻进程框架实现实时消息推送。关键不是 PHP 版本有多新,而是选对方案、写对逻辑、管住连接。
核心实现方式:用 Workerman 或 Swoole 启动 WebSocket 服务
PHP 8.2 完全兼容 Workerman(v4+)和 Swoole(v5+),两者都支持协程/异步 I/O,适合高并发长连接场景。
- Workerman:纯 PHP 实现,无需编译扩展,部署简单,适合中小项目
- Swoole:需安装 C 扩展,性能更强,原生支持 WebSocket Server、协程、定时器、TaskWorker,适合中大型实时系统
示例(Workerman + PHP 8.2):
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$ws = new Worker('websocket://0.0.0.0:2345');
$ws->count = 4; // 开启 4 个进程
$ws->onConnect = function ($connection) {
echo "新连接:{$connection->id}\n";
};
$ws->onMessage = function ($connection, $data) use ($ws) {
// 解析 JSON 消息(建议约定格式)
$msg = json_decode($data, true);
if (isset($msg['type']) && $msg['type'] === 'broadcast') {
foreach ($ws->connections as $conn) {
$conn->send(json_encode(['from' => $connection->id, 'content' => $msg['content']]));
}
}
};
$ws->onClose = function ($connection) {
echo "连接 {$connection->id} 关闭\n";
};
Worker::runAll();
启动命令:
php websocket_server.php start -d
前端怎么连?用标准 WebSocket API 就行
PHP 8.2 服务端不干预前端写法,浏览器直接用原生 WebSocket:
const ws = new WebSocket('ws://your-server.com:2345');
ws.onopen = () => {
console.log('已连接');
ws.send(JSON.stringify({ type: 'broadcast', content: 'Hello from browser' }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('收到:', data);
// 更新 DOM 或触发通知
};
ws.onerror = (err) => console.error('WebSocket 错误', err);
ws.onclose = () => console.log('连接已断开');
注意:开发环境用 ws://,生产环境务必配 Nginx 反向代理 + HTTPS,并升级为 wss://。
真实业务必须处理的三件事
用户身份绑定
客户端连接时带上uid或 token(如ws://.../2345?uid=123&token=abc),服务端在onConnect中解析并存入$connections[$uid] = $connection,后续可精准推送。房间/分组管理
不是所有消息都要广播。可用数组或 Redis 存储房间成员(如room:chat_1001 → [uid1, uid2]),发消息前查表定向投递。连接生命周期管理
onClose中及时unset连接;加心跳检测(如每 30 秒收一次 ping,超时关闭);前端监听onclose后自动重连(带退避策略)。
生产环境不能跳过的配置项
-
使用 Nginx 做反向代理,透传 WebSocket 头部:
location / { proxy_pass http://127.0.0.1:2345; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } -
设置超时时间(Nginx 和 PHP 层都要调):
- Nginx:
proxy_read_timeout 300; - Workerman:
$connection->timeout = 300;
- Nginx:
日志与监控:记录连接数、错误率、消息吞吐量,可用 Prometheus + Grafana 接入。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











