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

PHP7环境下CodeIgniter的Ion Auth登录失败,Session为空问题排查

看来你在把CodeIgniter项目从PHP5迁到PHP7时遇到了Session丢失导致登录失败的问题,我帮你梳理几个核心排查点和修复方案:

问题核心分析

PHP7对Session、错误处理以及第三方库的兼容性有不少变化,你的情况本质是登录后Session数据未被正确写入/读取,导致Ion Auth的logged_in()校验返回false。以下是具体排查和修复步骤:

1. 优先检查Ion Auth版本兼容性

旧版Ion Auth(尤其是2.x及更早版本)没有适配PHP7的Session处理逻辑,比如原生session_start()的参数变化、Session变量的赋值方式差异。

  • 直接升级到Ion Auth的最新稳定版(3.x以上),官方已经修复了PHP7的兼容性问题,能确保登录后正确写入CodeIgniter Session。
  • 如果暂时无法升级,手动检查Ion Auth的login()方法,确认登录成功后调用了$this->session->set_userdata()写入用户标识(比如user_id、identity),而非依赖原生PHP Session。

2. 调整CodeIgniter Session配置

PHP7对Cookie和文件权限的检查更严格,config.php中的Session配置可能需要修改:

  • 若使用默认的files驱动,确保$config['sess_save_path']指向的目录存在,且PHP进程有读写权限(权限设为0700,避免PHP7因权限不足拒绝写入)。
  • 调整Cookie相关参数,避免因安全限制导致Session无法写入:
    $config['cookie_secure'] = FALSE; // 非HTTPS环境必须设为FALSE,PHP7默认会严格校验
    $config['cookie_httponly'] = TRUE;
    $config['sess_expiration'] = 7200; // 根据业务需求调整,避免Session过早过期
    
  • 若开启了数据库存储Session(sess_use_database = TRUE),确认Session表的字段类型适配PHP7(比如user_data字段用TEXT而非VARCHAR)。

3. 确认Basic库的CI实例获取正确

你的Basic库依赖$this->_ci调用CI组件,若实例获取失败,所有Session、Ion Auth操作都会失效:

  • 在Basic库的构造函数中确保正确获取CI实例:
    public function __construct() {
        $this->_ci =& get_instance(); // 注意引用符号&,避免创建新实例
    }
    
    可以在check_login()方法开头加个测试,确认$this->_ci->session存在:
    var_dump($this->_ci->session);
    die();
    

4. 排查PHP7错误日志

PHP7会把PHP5的警告升级为错误,可能Session初始化时出现了隐性错误:

  • 开启PHP错误日志(修改php.ini的error_log路径),查看是否有Session相关的报错(比如“Session save path not valid”“Permission denied”)。
  • 打开CodeIgniter的开发模式(index.php中define('ENVIRONMENT', 'development');),直接查看页面上的错误提示。

5. 替换die()为CodeIgniter标准输出

你代码中大量使用die()中断请求,这会跳过CodeIgniter的收尾流程——而CodeIgniter的Session是在请求结束时才写入存储的,提前中断会导致Session数据丢失:

  • 把所有die()替换为CodeIgniter的$this->output方法:
    // 替换die(json_encode($res)):
    $this->output
         ->set_content_type('application/json')
         ->set_output(json_encode($res));
    // 替换die('<script>...</script>'):
    $this->output->set_output('<script>alert("Anda belum login atau sesi login anda sudah habis, silahkan melakukan login ulang.");window.location.replace("'.base_url().'");</script>');
    
    这样能确保Session数据被正确写入存储。

6. 手动验证Session写入

在Auth控制器的login()方法中,登录成功后手动打印Session数据,确认是否写入:

if ($this->ion_auth->login($post['email'], $post['password'], false)) {
    // 测试:打印Session内容
    var_dump($this->session->userdata());
    // 原有代码...
}

如果Session为空,说明Ion Auth没有正确写入,可手动补充Session赋值:

$user = $this->ion_auth->user()->row();
$this->session->set_userdata([
    'user_id' => $user->id,
    'identity' => $user->email,
    'logged_in' => TRUE
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:05