Apache2.4下PHP5.3与CodeIgniter4跨域名会话共享问题排查
问题描述
我折腾了好多子域会话共享的文章,都没解决问题,情况如下:
- 环境:本地Apache2.4虚拟主机,一个顶级域名(PHP5.3原生代码),一个子域名(PHP8.x + CodeIgniter4)
- 现象:CI4站点登录生成
PHPSESSID的会话Cookie;顶级域PHP5.3站点登录也生成同名Cookie,会话文件前缀是sess_且ID和CI4的一致,存储路径也相同,但两边会话就是不通 - 已尝试:调CI4配置、改php.ini、在会话启动前加PHP代码设置
- 测试验证:搭了两个纯PHP站点(含PHP8),用指定
session_name('PHPSESSID')的脚本测试,会话变量能正常互通,确定问题出在CodeIgniter4上
需求:怎么让CodeIgniter4的会话和原生PHP会话兼容互通?
解决方案
要让CI4和原生PHP共享会话,核心是让CI4放弃自己的会话特殊处理,完全贴合原生PHP的会话机制,具体操作如下:
1. 修改CI4的核心会话配置
找到app/Config/App.php,调整以下配置项:
public $sessionDriver = 'files'; // 和原生PHP一致使用文件存储会话 public $sessionCookieName = 'PHPSESSID'; // 统一会话Cookie的名称 public $sessionExpiration = 7200; // 和php.ini中session.gc_maxlifetime的值保持一致 public $sessionSavePath = null; // 留空会自动使用php.ini的存储路径,确保和原生PHP同路径 public $sessionMatchIP = false; // 关闭IP匹配,避免跨子域时会话失效 public $sessionTimeToUpdate = 300; // 可按需调整,或保持和原生PHP一致 public $sessionRegenerateDestroy = false; // 禁止销毁旧会话,防止原生PHP无法读取
2. 可选:禁用CI4自动初始化会话
如果你的CI4项目不需要框架自动启动会话,可以在app/Config/App.php中添加:
public $autoInitializeSession = false;
之后在需要使用会话的位置,直接调用原生PHP的会话代码:
session_name('PHPSESSID'); session_start();
这种方式能100%和原生PHP会话逻辑对齐,避免CI4的额外处理干扰。
3. 统一两个PHP版本的配置
确保PHP5.3和PHP8.x的php.ini中,以下配置完全一致:
session.save_path: 会话文件存储在同一个目录,且两个PHP进程都拥有读写权限session.name: 均设置为PHPSESSIDsession.cookie_domain: 设置为.你的域名.com(开头的点不能省略,确保所有子域都能读取该Cookie)session.cookie_path: 设置为/session.gc_maxlifetime: 设置相同的会话过期时间session.cookie_httponly: 两个环境保持一致(建议开启,但不要一个开启一个关闭)
4. 调整CI4的序列化格式
CI4默认的会话序列化方式与原生PHP不同,而PHP5.3仅支持老的serialize()格式,因此需要在app/Config/Session.php中修改:
public $serializer = 'php'; // 使用原生PHP的序列化方式,确保PHP5.3能解析会话数据
重点提醒:PHP5.3不支持
php_serialize格式,必须设置为php,否则CI4存储的会话数据无法被PHP5.3读取。
5. 测试验证
完成配置后,按以下流程验证:
- 在CI4站点登录,写入会话变量,例如
$_SESSION['ci4_user'] = 'test'; - 访问顶级域的PHP5.3站点,打印
$_SESSION,确认能获取到ci4_user变量 - 反向测试:在PHP5.3站点写入
$_SESSION['php5_user'] = 'demo';,在CI4站点读取,确认能获取到该变量
关键注意事项
- 序列化格式是核心问题:CI4默认的序列化方式PHP5.3不兼容,必须改为
php - Cookie域名必须带开头的点,否则子域和顶级域无法共享同一个Cookie
- 会话存储路径必须一致,且权限充足,确保两个PHP版本都能读写会话文件
- 关闭CI4的IP匹配和会话自动销毁机制,避免干扰原生会话的读取
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

