Webman可支撑电子病历系统,但需优化并发写入(PDO持久连接+连接池调优)、JSON字段查询(拆分高频字段+虚拟列索引)和SSE流式推送(禁用缓存+关闭输出缓冲+规范数据格式)。

Webman 能撑起电子病历系统,但直接套用默认配置会卡在并发写入、JSON 字段处理、流式报告输出这三个关键点上。
并发写入病历数据时 MySQL 连接池打满
电子病历高频更新(如护士实时录入生命体征)会导致 mysql_connect 频繁创建连接,Workerman 进程常驻特性反而放大了连接泄漏风险。
- 必须禁用 PHP 默认的
mysql扩展,改用PDO+pdo_mysql,并显式设置PDO::ATTR_PERSISTENT => true - 在
config/database.php中将pool_size设为进程数 × 2~3,例如 4 核机器设为 12 - 避免在控制器里手动
new PDO(),统一走Db::connection()获取连接,框架会自动复用 - 对病历主表(如
medical_records)的UPDATE操作,优先用INSERT ... ON DUPLICATE KEY UPDATE替代先SELECT再UPDATE,减少锁等待
病历 JSON 字段查询慢且无法建索引
病历中检查报告、用药记录等半结构化内容存为 JSON 后,WHERE json_contains(content, '"glucose":') 这类查询在 MySQL 5.7+ 虽支持,但全表扫描依然明显。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 不要把所有字段塞进单个
contentJSON 字段;拆出高频检索字段(如diagnosis_code、drug_name)作为独立列 - MySQL 8.0+ 可对 JSON 字段建虚拟列 + 索引:
ALTER TABLE medical_records ADD diagnosis_code AS (json_unquote(json_extract(content, '$.diagnosis.code'))) STORED,再CREATE INDEX idx_diag_code ON medical_records(diagnosis_code) - PHP 层解析 JSON 前先用
strlen($json_str) > 10240判断是否超长,超长则改用json_decode($json_str, false, 512, JSON_BIGINT_AS_STRING)防止内存溢出
SSE 流式推送检查结果不生效
前端监听 EventSource('/api/sse') 但一直 pending,或服务端调用 response()->send() 后连接立即断开。
- 必须在路由定义里关闭中间件缓存:
Route::get('/api/sse', [SseController::class, 'stream'])->middleware('throttle:0');(注意throttle:0禁用限流) - 控制器方法开头加
ob_end_clean();和ini_set('output_buffering', 'off');,否则 Workerman 的 buffer 会拦截 chunk 输出 - 每次推送需带换行符和双空行:
echo "data: ".json_encode($event)."\n\n";,漏掉\n\n浏览器不触发message事件 - 连接保持时间不能依赖
set_time_limit(0),要靠 Workerman 的$connection->closeAfter(300)主动控制超时
真正难的不是让病历存进去,而是当 200 个医生同时编辑同一份危重病人病历时,怎么让每个操作都原子、可追溯、不丢数据——这得靠 MySQL 行级锁 + 业务层版本号校验,Webman 本身只提供执行通道,不解决领域逻辑冲突。


















