调用session_regenerate_id()后应用仍使用旧会话文件的问题排查
session_start(); $_SESSION['user_id'] = 0; session_regenerate_id(); $_SESSION['user_id'] = 5;
执行上述代码后,后续访问时$_SESSION['user_id']仍为0,这是为什么?我是否误解了session_regenerate_id()的工作机制?还是需要在其他地方处理问题?
我看到C:\xampp\tmp中生成了两个会话文件,但不明白为何应用会使用旧文件。
我遇到的实际场景是:在.php文件开头执行session_start()和session_regenerate_id()后,无法访问后续设置的$_SESSION['user_id']:
session_start(); session_regenerate_id(); $_SESSION['user_id'] = 9; // 因应用使用旧文件,无法访问该值
希望得到相关帮助。
你检查过php.ini中的session.use_trans_sid选项吗?
我的php.ini中设置了session.use_trans_sid=0,按建议又设置了session.use_strict_mode=1,但问题仍未解决。
注:我假设这是两个不同的HTTP/HTTPS请求(两段以session_start()开头的代码)。你可以查看第二个会话文件在session_start前后存储的内容,也可以在regenerate前后执行print_r($_SESSION)。我怀疑你未分享的中间代码影响了session_start。
我已将代码简化为帖子中的示例,排除其他代码干扰。
我做了以下测试:
清空tmp文件夹并运行代码,注释掉
session_regenerate_id():- 生成的会话文件中
user_id为9,addrelease.php输出的user_id为9,符合预期 - 注释掉设置
user_id为9的代码,重新登录后生成了一个user_id为8的新文件,也符合预期
- 生成的会话文件中
再次清空tmp文件夹并重启服务器,保留
session_regenerate_id()执行,loginuser.php运行以下代码:
session_start(); $_SESSION['user_id'] = 8; session_regenerate_id(); $_SESSION['user_id'] = 9; $response['success'] = true; $response['username'] = "test"; echo json_encode($response); exit;
执行完成后生成两个会话文件,一个user_id为9,另一个为8;但之后addrelease.php执行完成后输出的user_id为8。
- 修改loginuser.php代码如下,查看退出前的
user_id值:
session_start(); $_SESSION['user_id'] = 8; session_regenerate_id(); $_SESSION['user_id'] = 10; $response['message'] = $_SESSION['user_id']; $response['success'] = false; $response['username'] = "test"; echo json_encode($response); exit;
再次清空tmp文件夹并重启服务器,loginuser.php输出的user_id为10(说明当前请求使用了正确的会话文件),但addrelease.php仍读取到旧的user_id值。
编辑补充:登录操作和添加发布操作之间,还有一个不触发.php文件的仪表板操作。
内容的提问来源于stack exchange,提问作者dan

