websocket服务必须手动在start.php中注册,因webman不内置websocket服务器且config/server.php仅支持http配置;需在worker::runall()前new worker('websocket://0.0.0.0:9502'),并实现onconnect/onmessage/onclose,维护uid-connection映射,多进程时用redis替代内存数组,广播前预编码json,生产环境关闭debug、nginx反代、合理设置worker数。

WebSocket服务必须手动注册到 start.php,不能只改 config/server.php
Webman 本身不内置 WebSocket 服务器,config/server.php 里配的全是 HTTP 相关配置,改了对 WebSocket 完全无效。想跑起来,必须在 start.php 末尾、Worker::runAll() 之前显式 new 一个 Worker 实例,协议写成 websocket://0.0.0.0:9502 这种格式。
常见错误现象:
- 浏览器控制台报
WebSocket connection to 'ws://...' failed,但后端没报错 - HTTP 接口正常,WebSocket 连不上,
netstat -tuln | grep 9502查不到监听端口
实操建议:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 端口别和 HTTP 冲突:HTTP 默认
8787,WebSocket 建议用9502或2345 - 务必调用
$worker->onConnect、onMessage、onClose,否则连接建立后收不到任何数据 - 检查 PHP 扩展:
php -m | grep -E "pcntl|posix",缺一不可
用户连接必须自己维护 uid → connection 映射
Webman 没有 connectionManager 这类封装,$worker->connections 是 raw socket 列表,不含业务身份。不自己存映射,就做不到私聊、踢人、在线状态同步。
实操建议:
- 在
onConnect里解析$_GET['uid']或 token,校验通过后存入全局数组:$worker->uidConnections[$uid] = $connection - 必须在
onClose中unset($worker->uidConnections[$uid]),否则内存泄漏 + 重复推送 - 别直接遍历
$worker->connections广播,改用foreach ($worker->uidConnections as $conn),跳过未登录或断连的脏连接 - 多 Worker 进程时,数组映射失效——此时必须用 Redis 的
SET存成员、PUB/SUB做跨进程广播
高并发群聊广播性能卡在 JSON 编码和遍历方式
万级在线时,一次群聊广播若在循环里反复 json_encode($msg) + foreach ($worker->connections as $conn),CPU 和网络栈会陡增,延迟飙升。
实操建议:
-
json_encode($msg)提前做一次,复用字符串,别放循环里 - 大群消息建议拆包:先发 header(含
msg_id、type、seq),再发 payload,前端按序组装 - 敏感操作(撤回、已读)必须带服务端时间戳和单调递增
seq,防止客户端伪造或乱序 - 避免用
sendToAll()这种黑盒方法——它遍历所有 raw connection,包含大量无效连接
生产环境部署必须关 debug、启扩展、走 Nginx 反代
本地能跑 ≠ 生产可用。Webman 在生产环境掉链子,90% 出在基础配置漏项。
实操建议:
-
config/app.php里确保'debug' => false,否则日志刷爆磁盘、性能下降明显 - Nginx 必须反向代理,处理 SSL 终止和静态资源,动态请求转给
http://127.0.0.1:8787 - Docker 部署时,
docker-compose.yml要显式挂载pcntl和posix扩展,不能只靠 base image - 别设
$worker->count = 32在 4 核机器上——推荐值是 CPU 核数 ×1.5,太高导致上下文切换开销压垮 CPU
真正难的不是写通逻辑,而是连接生命周期管理、跨进程状态同步、广播路径优化这三块。漏掉任意一个,QPS 上不去,消息就丢。










