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

CodeIgniter使用session时ajax请求阻塞其他页面加载问题

问题原因

这是PHP默认文件Session的独占锁机制导致的,属于PHP会话的固有特性,不是你代码逻辑存在错误。
PHP默认使用文件存储会话数据时,只要请求加载了Session(CodeIgniter框架如果配置了自动加载Session库,控制器初始化阶段就会自动调用session_start()),就会对当前会话对应的服务器本地session文件加独占锁,该锁会一直持有到当前请求脚本执行完毕才会自动释放。
同一会话ID的后续请求都会在session_start()阶段被阻塞,直到前序请求释放session锁,这就是你会看到home页面要等ajax请求结束才加载的原因,不需要操作Session的请求如果没提前释放锁,也会被加锁逻辑阻塞。

解决方法
  • 不需要操作Session的方法,开头直接释放会话锁
    你提供的代码里getAjaxTestData、Home方法都没有读写Session的需求,直接在方法第一行加session_write_close()即可主动释放锁,不需要等请求执行完:
public function getAjaxTestData()
{
    // 第一行释放会话锁,不影响后续逻辑执行
    session_write_close();
    // 原有逻辑不变,额外注意date格式里分钟的符号是i不是m
    sleep(15);
    $data=array();
    $data['success']=0;
    $data['start_time']=date("Y-m-d h:i:s");
    $data['end_time']=date("Y-m-d h:i:s");
    $data['success']=1;
    echo json_encode($data);
    die();
}

function Home()
{
    session_write_close();
    $this->load->view('home');
}
  • 有Session读取需求的方法,读完立刻释放锁
    如果方法内需要读取Session数据,先取完需要的内容,再调用session_write_close()释放锁,再执行耗时逻辑:
public function getAjaxTestData()
{
    // 先读取需要的会话数据
    $user_id = $this->session->userdata('user_id');
    // 读完立刻释放锁
    session_write_close();
    // 后续执行耗时逻辑不会阻塞其他请求
    sleep(15);
    // 其他逻辑
}
  • 进阶优化:更换Session存储介质
    如果业务有大量并发同会话请求的场景,可以把Session存储从文件切换为Redis、Memcached这类内存存储,这类存储默认没有文件独占锁的机制,从根本上避免会话阻塞问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:09:04