PHP会话在首次访问时未保存在浏览器中


PHP Session not being saved in browser on first access

[用代码更新]

我有一个奇怪的会话问题,似乎只有在有人第一次访问页面时才会出现。

如果您转到以下页面并单击"下一步",您可能会发现您被发送到一个未找到页面。如果您返回链接并再次按"下一步",这次它将起作用。

https://pulse.gd/Xchbeb

奇怪的是,如果你清除了你的cookie和所有其他与浏览器相关的历史记录,这个问题似乎不会再次发生。如果你从不同的浏览器尝试,也不会。

我查看了Chrome上的"资源"选项卡,可以看到会话最初并没有保存,而是在第二次尝试中。

这是代码的相关部分。所以在脚本的开头:

// set the http headers
header("Content-Type: text/html;charset=utf-8");
header("X-XSS-Protection: 1; mode=block");
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("X-Content-Type-Options: nosniff");
header("X-Permitted-Cross-Domain-Policies: master-only");
session_set_cookie_params ( $lifetime = 0, $path = "/", $domain= "pulse.gd", $secure = TRUE, $httponly = true );
// set-up the session handler
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
register_shutdown_function("sess_shutdown");

然后在被调用的函数的顶部:

session_start();

那么当它已经建立了要传递到下一步的阵列时

// store the step array in the session object
$_SESSION['stepArray'] = serialize($stepArray);

此时它(应该)显示下一页。这是由Smarty处理的。

有人有什么建议吗?

感谢

重写代码:

我确信您不需要一半的头,而且大多数会话设置都是无效语法。

// set the http headers
header("Content-Type: text/html;charset=utf-8");
//header("X-XSS-Protection: 1; mode=block");
//header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("X-Content-Type-Options: nosniff");
//header("X-Permitted-Cross-Domain-Policies: master-only");
session_set_cookie_params( 0, "/", "pulse.gd", TRUE, true );
/*** What is the intended purpose of these below functions? **/
// I'm pretty sure you don't need to set these. 
// UNLESS they've been set in place by Smarty, in which case leave them.
// set-up the session handler
// session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
// register_shutdown_function("sess_shutdown");

错误很可能在您的sess_open函数中,我真的怀疑您是否真的需要它。

  • 我还想说,如果你的页面有5000行代码,那你就做错了
  • 不要将session_start放在函数的顶部,它需要放在发送到浏览器的页面的顶部
  • 研究并实现了PHP错误日志
  • 回复:session_set_save_handler请检查以下内容:https://stackoverflow.com/a/13963907/3536236