
最近排查一个 PHP 后台时遇到过一个比较隐蔽的问题:单个接口请求都不慢,但同一个用户连续触发多个接口时,后面的请求会明显排队,尤其是页面同时加载统计、消息、权限和用户信息时,感觉整个后台突然变卡。
一开始查了数据库、Redis 和前端请求数量,都没有发现明显异常。后来把请求时间线拉出来看,才发现这些接口虽然同时发出,但实际上并没有同时执行,而是在服务端一个接一个完成。
问题最后落在 PHP Session。
PHP 默认使用文件保存 Session 时,同一个 Session 在请求开始后会被锁住。第一个请求只要还没有结束,后面使用同一个 Session 的请求就可能一直等待。即使后面的接口本身只需要几十毫秒,也要等前面的请求释放锁以后才能继续执行。
后来把只需要读取登录信息的接口调整了一下,拿到必要的 Session 数据后就尽早调用 session_write_close() 释放锁。对于耗时接口,也不再让 Session 一直保持打开状态。部分无状态接口则直接改成 token 鉴权,减少对 Session 的依赖。
改完以后,同一个用户同时发起多个请求时,接口可以真正并行处理,页面响应也明显稳定很多。
所以遇到"单个接口不慢,但一起请求就卡"的 PHP 项目,我现在除了查数据库和服务器,也会检查 Session 锁。很多并发问题,不一定出在 SQL,也可能是一个很容易忽略的 Session 文件把所有请求排成了队。
#PHP开发 #Session #并发优化 #后台系统