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

调用session_regenerate_id()后应用仍使用旧会话文件的问题排查

PHP 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:15:55