Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP会话在标头之后被破坏/丢失_Php_Session_Header - Fatal编程技术网

PHP会话在标头之后被破坏/丢失

PHP会话在标头之后被破坏/丢失,php,session,header,Php,Session,Header,我有一个脚本,在使用header()重定向到/之前设置一些会话值 我读过很多关于$\u会话变量在header()之后被销毁/丢失的帖子,即使在我实现了这一点之后: // set session here session_regenerate_id(true); session_write_close(); header("Location: /"); session\u start()设置在正确的位置,有人知道我可能缺少什么吗 在index.php页面上,我有以下内容: session_st

我有一个脚本,在使用
header()
重定向到
/
之前设置一些会话值

我读过很多关于
$\u会话
变量在
header()之后被销毁/丢失的帖子,即使在我实现了这一点之后:

// set session here

session_regenerate_id(true);
session_write_close();
header("Location: /");
session\u start()
设置在正确的位置,有人知道我可能缺少什么吗

在index.php页面上,我有以下内容:

session_start();
print_r($_SESSION);

// outputs nothing :'(

代码非常复杂,因此不会全部发布,只发布片段。

我从未见过由于使用位置标题而导致的任何会话相关问题-您确定要在这两个页面上调用吗



嗯。。。在您添加上面的session\u start位之前,这个答案更有意义,并且提到您确信自己正在使用session\u start:-)

必须在会话结束前发送头文件

session_regenerate_id(true);

header("Location: /");
// the header must be sent before session close
session_write_close(); // here you could also use exit();

为了解决这个问题,我们得出的结论是,这是服务器配置的问题,考虑到主机在这方面是众所周知的,这并不奇怪;在header:D之后,我解决了这个问题。

在header重定向之后,您需要退出PHP脚本:

header("Location: /");
exit();

您不需要在每个页面中启动会话\ u start()。因为在关闭浏览器之前,您在php.ini中指定的整个路径都会保留相同的会话。这里没有提到的一个可能的选项是,我正在创建另一个会话。在php中使用会话时,一次只能使用一个会话。如果创建新会话,旧会话将丢失。当您为登录创建一个会话,并且可能希望为其他内容创建另一个会话时,这种情况更可能发生(无论如何,不建议这样做)。我的案例是一个flash()方法,我只在添加/更新/删除帖子后使用它创建会话。并在视图中使用该会话来显示消息,然后将其销毁。每次我在添加/更新/删除用于登录的其他会话时创建新会话时,该会话都会被销毁。这不是经常发生的事情,但这是可能的。

即使在删除
会话\u REGENATE\u id
行之后,同样的问题仍然存在。是的,我确信
会话\u start()
在所有正确的位置都被调用。如果您去掉标题位置,请直接更改URL(在浏览器中)会话数据可用吗?嗯。。。它仍然没有设置,也许这不是一个
header()
问题?我建议使用session\u start尽可能靠近任何PHP include的开头,并将include作为所有页面上的第一项(即:pre-doctype/HTML headers等)。我遇到了同样的问题,并添加了“exit()”在重定向解决后,你能更精确一点吗?不,不幸的是我不能。当时的主机不允许开发人员修改
php.ini
文件,移动到不同的主机,我们可以控制它,问题就解决了。对于任何阅读本文的人,我想我可能有解决方案。这是张贴在上的公认答案,因为
exit
是一种语言结构,您可以使用
exit(无括号)。这是保存2个字符代码的有用提示。:-)评论:我不明白。我的母语不是英语,但你的句子把我弄糊涂了。它需要一些带有代码块的文本格式吗?@H.Hasenack是的,我同意你的看法,这是一个简短的回答,可以理解其中的任何内容。所以我编辑并扩展了它。希望现在更有意义。