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方法:
这样能确保Session数据被正确写入存储。// 替换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>');
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
相关产品推荐
相关产品推荐

