LiteSpeed/PHP服务器并行请求阻塞 多标签页串行加载问题咨询
根因判定
你在LiteSpeed、Apache两套完全独立的Web服务环境下复现了完全一致的请求阻塞现象,可直接排除Web服务器配置错误的可能——两类服务器的请求调度、并发处理逻辑无共性,不可能因配置问题触发完全相同的串行阻塞表现,问题100%出在PHP运行层或站点应用逻辑上。
最高概率诱因:PHP默认Session文件锁
这是同类现象的最常见原因,和上层Web服务器类型无关:
- PHP默认采用文件方式存储会话数据,当请求调用
session_start()初始化会话时,会对当前用户对应的Session文件加排他锁。 - 该锁默认会持续持有到整个PHP脚本执行结束才会自动释放,若代码未主动释放锁,同个用户(携带相同Session ID)发起的所有需要调用
session_start()的请求,都会被阻塞等待前序请求释放锁后才能继续执行,和你描述的“第二个标签页必须等第一个请求PHP端处理完成才开始加载”的表现完全匹配。 - 由于锁机制是PHP核心层的默认行为,无论上层对接LiteSpeed还是Apache都会触发相同问题,和你更换Web服务环境后现象一致的特征完全吻合。
其他低概率应用层诱因
若排除Session锁问题,可按优先级排查以下逻辑:
- 应用自定义的用户级请求锁:部分业务逻辑会主动限制同个用户的并发请求数,加锁强制单用户请求串行处理。
- 数据库锁冲突:若两个请求同时操作同一条被前序请求加排他锁的数据,会触发SQL执行等待,但这类阻塞只会出现在数据库操作环节,不会导致第二个请求从启动阶段就完全挂起。
- 资源独占逻辑:比如请求需要读写用户专属的临时文件、缓存条目时加了排他锁,未及时释放导致后续请求等待。
验证与修复方案
- 快速验证方法:新建两个测试脚本,第一个脚本内容为
<?php session_start(); sleep(10); echo "first";,第二个脚本内容为<?php session_start(); echo "second";。同浏览器两个标签页同时访问两个脚本,若第二个脚本需要等待10秒才输出内容,即可确认是Session锁问题。 - Session锁修复:脚本中完成Session数据的读写操作后,立刻调用
session_write_close()(别名session_commit())主动释放Session文件锁,无需等待脚本执行结束再释放。主流PHP框架一般内置Session自动锁释放的配置项,开启对应配置即可全局生效。 - 若排除Session锁,顺着用户身份校验、请求拦截、数据操作链路逐层排查自定义锁逻辑即可。
内容的提问来源于stack exchange,提问作者NoxArt
相关产品推荐
相关产品推荐

