使用Webman开发高性能的在线考试系统

夜雪大大_6547

夜雪大大_6547

2026-06-24

679人浏览

原创

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

使用webman开发高性能的在线考试系统

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
Webman 2.2.0

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 自动完成,得一行行写进业务代码里。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

webman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

12464

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

7181

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2235

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4528

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5234

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

4111

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5957

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4682

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12482

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman和FastAPI的性能对比
Webman和FastAPI的性能对比

共0课时 | 328人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

webman初步使用及后台搭建
webman初步使用及后台搭建

共15课时 | 2.7万人学习