Webman能胜任高并发在线考试场景,但需针对性加固:HTTP连接数限制(worker_num与max_connection协同配置)、数据库连接池启用(避免PDO直连)、Redis心跳保活、防作弊后端校验(一次性token+客户端状态比对)、systemd服务化部署(含LimitNOFILE调优)及降级兜底逻辑。

Webman 能否胜任高并发在线考试场景
能,但默认配置下很快会出问题。Webman 基于 Workerman,本身是常驻内存的异步 I/O 框架,理论 QPS 远高于传统 PHP-FPM,但考试系统特有的瞬时峰值(如万人同时交卷)、长连接(实时监考、消息推送)、状态一致性(防切屏、防复制)等需求,会让很多开发者在压测时突然发现 connection reset、MySQL gone away 或 Redis 连接池耗尽。
关键瓶颈点及对应配置调整
不是换框架就能解决,而是要针对性加固几个环节:
-
HTTP 连接数限制:默认
worker_num是 CPU 核数,考试开始前 5 分钟大量考生预加载试卷,容易触发max_connection拒绝新连接。建议按并发预估值设为worker_num = min(64, cpu_count * 4),并在config/server.php中显式设置max_connection(例如2000) -
数据库连接复用失效:Laravel-ORM 或 ThinkPHP 的 DB 封装层默认不支持长连接复用,每次请求新建 PDO 连接。必须改用
webman/database扩展,并启用连接池:'pool' => ['min' => 20, 'max' => 200],否则 MySQL 端会报Too many connections -
Redis 订阅/发布延迟:实时监考消息靠 Redis pub/sub,但默认
redis-server的tcp-keepalive是 0,空闲连接易被中间设备断开。需在redis.conf中设tcp-keepalive 60,且 Webman 中使用Redis::subscribe()时要加心跳重连逻辑
防作弊逻辑不能只靠前端
考试系统里最常犯的错,是把“禁止复制”“禁止切屏”全写在 Vue/React 组件里,结果被 F12 一禁就失效。Webman 后端必须承担兜底责任:
- 所有试卷内容接口必须带一次性
token,由session_id+ 时间戳 + 随机盐生成,且服务端校验后立即失效 - 交卷请求必须携带客户端采集的
screen_width、screen_height、userAgent和页面可见性状态(document.hidden),后端比对历史请求是否突变 - 每 15 秒通过 WebSocket 上报一次心跳,含当前
performance.now()和document.hasFocus(),断连超 3 次直接标记异常
部署时最容易漏掉的 systemd 配置
用 php start.php start -d 启动看似没问题,但进程实际挂在终端会话下,SSH 断开或服务器重启后就没了。必须配 systemd 服务:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
[Unit] Description=Webman Exam Server After=network.target <p>[Service] Type=simple User=www-data WorkingDirectory=/var/www/exam ExecStart=/usr/bin/php /var/www/exam/start.php start -d Restart=always RestartSec=3 LimitNOFILE=65536</p><p>[Install] WantedBy=multi-user.target</p>
特别注意 LimitNOFILE 必须设够,否则高并发下 Too many open files 错误会直接导致 Worker 退出,而 Restart=always 又可能引发雪崩——因为重启期间新连接仍在涌入。
考试系统真正的难点不在功能实现,而在每个环节都得做“降级+兜底+可观测”。比如 Redis 挂了,试卷题干要能从本地缓存 fallback;MySQL 写入失败,交卷动作要转成队列异步处理并记录日志;这些逻辑没法靠 Webman 自动完成,得一行行写进业务代码里。










