You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何第二个独立AJAX请求需等待第一个AJAX响应返回?

问题原因分析:同一控制器下AJAX请求阻塞的问题

嘿,这个问题其实是CodeIgniter默认的Session机制在搞事情,我给你拆解清楚:

核心原因:Session文件排他锁

CodeIgniter默认使用文件型Session存储,当一个请求启动时,它会打开Session文件并加上排他锁——意思是在这个请求结束前,其他任何需要访问Session的请求都得排队等锁释放。

回到你的代码场景:

  • 第一个AJAX请求exp1里调用了sleep(10),这会让请求挂起10秒,但这段时间里Session文件一直被锁着。
  • 第二个AJAX请求exp2看似独立,但CodeIgniter的控制器默认会自动加载Session,所以它必须等exp1请求结束、Session锁释放后,才能开始执行并返回结果。

说白了就是:文件Session的排他锁把两个并行请求硬生生变成了串行执行。

可行的解决办法

这里有几个实用方案,你可以根据需求选:

  1. 在不需要Session的请求里提前释放锁
    如果exp1根本用不到Session数据,你可以在sleep前手动关闭Session,释放文件锁:
function exp1() {
    // 关闭Session,释放文件锁
    $this->session->close();
    sleep(10);
}

这样exp2请求就不会被阻塞,能立刻执行并返回结果。

  1. 更换Session存储驱动
    把Session从文件存储换成数据库、Redis或Memcached这类分布式存储方案。这些存储方式的锁粒度更细,不会因为一个请求阻塞所有同Session的请求。你可以在CodeIgniter的config.php里修改$config['sess_driver']来切换。

  2. 让特定请求跳过Session加载
    如果某个控制器方法完全不需要Session,你可以通过调整控制器构造方法或自定义路由,跳过Session的初始化流程(具体实现要根据你使用的CodeIgniter版本调整)。

内容的提问来源于stack exchange,提问作者Ganesh Gadge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:08:45