为何第二个独立AJAX请求需等待第一个AJAX响应返回?
问题原因分析:同一控制器下AJAX请求阻塞的问题
嘿,这个问题其实是CodeIgniter默认的Session机制在搞事情,我给你拆解清楚:
核心原因:Session文件排他锁
CodeIgniter默认使用文件型Session存储,当一个请求启动时,它会打开Session文件并加上排他锁——意思是在这个请求结束前,其他任何需要访问Session的请求都得排队等锁释放。
回到你的代码场景:
- 第一个AJAX请求
exp1里调用了sleep(10),这会让请求挂起10秒,但这段时间里Session文件一直被锁着。 - 第二个AJAX请求
exp2看似独立,但CodeIgniter的控制器默认会自动加载Session,所以它必须等exp1请求结束、Session锁释放后,才能开始执行并返回结果。
说白了就是:文件Session的排他锁把两个并行请求硬生生变成了串行执行。
可行的解决办法
这里有几个实用方案,你可以根据需求选:
- 在不需要Session的请求里提前释放锁
如果exp1根本用不到Session数据,你可以在sleep前手动关闭Session,释放文件锁:
function exp1() { // 关闭Session,释放文件锁 $this->session->close(); sleep(10); }
这样exp2请求就不会被阻塞,能立刻执行并返回结果。
更换Session存储驱动
把Session从文件存储换成数据库、Redis或Memcached这类分布式存储方案。这些存储方式的锁粒度更细,不会因为一个请求阻塞所有同Session的请求。你可以在CodeIgniter的config.php里修改$config['sess_driver']来切换。让特定请求跳过Session加载
如果某个控制器方法完全不需要Session,你可以通过调整控制器构造方法或自定义路由,跳过Session的初始化流程(具体实现要根据你使用的CodeIgniter版本调整)。
内容的提问来源于stack exchange,提问作者Ganesh Gadge
相关产品推荐
相关产品推荐

