Codeigniter 3.0在Ubuntu下会话不完整仅显示__ci_last_regenerate求助
__ci_last_regenerate的问题 我之前帮不少开发者解决过CodeIgniter 3在Ubuntu下的会话丢失问题,你遇到的这种只返回Array ( [__ci_last_regenerate] => 1522220387 )的情况,大多是会话存储或配置层面的问题,咱们一步步排查:
检查会话存储目录的权限
CodeIgniter默认会把会话文件存在application/cache/session目录(如果没指定其他路径的话)。Ubuntu下Web服务一般以www-data用户运行,要是这个目录的权限不对,CI根本写不进会话数据。
先手动确认目录存在,然后执行权限修改命令:sudo mkdir -p application/cache/session sudo chown -R www-data:www-data application/cache/session sudo chmod 700 application/cache/session700权限是最安全的,只有所有者能读写,避免会话文件被其他用户访问。
核对
config.php里的会话核心配置
打开application/config/config.php,重点检查这几个参数:$config['sess_driver'] = 'files';:确保用的是文件驱动(默认值,也是最稳定的)$config['sess_save_path'] = APPPATH.'cache/session/';:路径要准确,用APPPATH常量避免硬编码错误$config['sess_match_ip'] = FALSE;:如果开启了IP匹配,要是你的网络环境有代理或者IP动态变化,会直接导致会话失效,开发环境建议先关掉$config['sess_cookie_secure'] = FALSE;:本地开发用HTTP的话,这个必须设为FALSE,不然浏览器不会保存会话Cookie$config['sess_regenerate_destroy'] = FALSE;:暂时设为FALSE,避免重新生成会话时销毁旧数据导致丢失
确认会话数据的设置方式正确
别用原生PHP的$_SESSION直接操作(虽然CI兼容,但容易出问题),一定要用CI自带的会话方法:// 单个键值对设置 $this->session->set_userdata('username', 'Shadab'); // 批量设置 $this->session->set_userdata([ 'email' => 'your@email.com', 'role' => 'admin' ]);然后用
$this->session->all_userdata()或者$this->session->userdata('username')来获取,别直接打印$_SESSION(CI对会话做了封装)。排查PHP全局会话配置
偶尔Ubuntu的PHP默认配置会影响CI会话,你可以创建一个phpinfo.php文件,内容是<?php phpinfo(); ?>,访问后查看以下项:session.save_path:确认这个路径是可写的,或者被CI的配置覆盖成了我们设置的application/cache/sessionsession.cookie_domain:如果是本地开发,这个值应该是空或者localhost,别设成生产环境的域名
做一个极简测试
写个简单的测试控制器,排除业务代码的干扰:class SessionTest extends CI_Controller { public function index() { // 设置测试会话数据 $this->session->set_userdata('test_data', 'Hello CI Session'); // 打印所有会话数据 var_dump($this->session->all_userdata()); } }访问这个控制器,如果还是只显示
__ci_last_regenerate,那基本可以确定是存储路径或权限的问题,回到第一步重新检查。
内容的提问来源于stack exchange,提问作者Shadab

