php开源在线考试系统
打开一份 PHP 写的开考试在线考试系统源码,你会发现它本质上就是源线个“题库 + 权限 + 计时器”的组合。没那么玄乎。系统我见过不少学校机房还在用单机版考试软件,开考试U 盘拷来拷去,源线其实换成 PHP 的系统 Web 方案,一台普通服务器就能撑住几百人同时答题。开考试 这类系统最核心的源线模块是题库管理。MySQL 里通常建两张表:一张存题目,系统一张存选项。开考试题目类型分单选、源线多选、系统判断、开考试填空,源线有些还带简答。系统字段设计上,题干用 text,选项用 JSON 存,正确答案单独一个字段。别小看这个结构,我见过有人把选项拆成四列 a、b、c、d,结果遇到六个选项的题就傻眼了。JSON 方案虽然查询麻烦点,但扩展性吊打固定列。 考试逻辑这块,PHP 的 session 和 cookie 配合很关键。考生登录后生成一个 attempt_id,每次翻页或提交答案都往 answer 表里写一条记录。有人喜欢用 Ajax 实时保存,有人等交卷时一次性写入。前者体验好但服务器压力大,后者简单可一旦浏览器崩溃就全丢。折中方案是每答完一题就异步存一次,用 计时器实现有两种路子。纯前端 JS 倒计时,时间到了自动提交——但考生改系统时间就废了。靠谱的做法是后端记录开考时间,每次请求都校验剩余秒数。PHP 里用 防作弊方面,PHP 能做的其实有限。禁止复制粘贴用 CSS 的 开源系统里,PHPEMS 和 Exam 这两个项目值得看。PHPEMS 功能全,带题库导入、随机组卷、成绩分析,代码结构偏传统 MVC。Exam 更轻量,适合二次开发。不过它们的共同问题是前端太老,很多还在用 jQuery 和 Bootstrap 3。你要是接手改造,建议把答题页用 Vue 或 React 重写,后端接口保持 PHP 不动。 数据库优化容易被忽略。考生交卷时批量插入答案,如果一条条 部署上,Nginx + PHP-FPM 比 Apache 省资源。考试前把 最后说个真事。某高校用 PHP 考试系统,考到一半服务器 CPU 飙到 100%,查日志发现是随机组卷的 SQL 写了个 fetch 发个 POST 到 save_answer.php,返回个 JSON 状态码就行。time() - start_time 算差值,超过考试时长就拒绝继续答题并强制交卷。这个逻辑写进中间件或者每个接口开头,别偷懒。user-select: none 加 JS 监听 copy 事件,防不住开发者工具。切屏检测靠 visibilitychange 事件,切一次记一次,超过三次自动交卷。我见过一个系统更狠,每 30 秒调一次摄像头拍照,用 WebRTC 传到服务器存着。但这对服务器带宽要求太高,小规模考试没必要。INSERT,一百人同时交卷就能把 MySQL 连接数打满。用事务包起来,或者拼成一条 INSERT INTO answers VALUES (...),(...),(...),速度差十倍。另外考完试的试卷别急着删,加个 is_deleted 字段软删除,万一有成绩争议还能翻出来查。opcache.enable 打开,opcache.validate_timestamps 设成 0,性能提升明显。如果预计并发超过 500,数据库读写分离或者上 Redis 缓存题目和选项。别等崩了再调,考前压测一轮用 ab 或 wrk 跑一下,心里有底。ORDER BY RAND(),题库两万条直接拖垮数据库。改成先取 ID 范围再随机偏移,问题消失。所以啊,开源系统拿来就用可以,但得知道它哪里会炸。
-
上一篇
-
下一篇