如何避免PHP会话“u start()vs”的第22条陷阱;“已发送邮件头”;警告
我有一个在本地服务器上运行完全正常的应用程序 它需要两件事:如何避免PHP会话“u start()vs”的第22条陷阱;“已发送邮件头”;警告,php,Php,我有一个在本地服务器上运行完全正常的应用程序 它需要两件事: 一个活动的$\u会话,因此每个页面上都有许多关键数据元素可用。(比如用户id和用户角色。) 在我的页面顶部有几个“require_once()”调用,这样我就有了一些可用的常量和标准消息,并且每个页面上都有相同的标题 同样,在我的本地服务器上(使用PHP5.6),这一切都很好 但是,在我的主机服务器上(也使用PHP5.6),我有一个第22条军规: 如果我在每个页面上调用“session_start()”,由于我使用了“require
- 如果我在每个页面上调用“session_start()”,由于我使用了“require_once()”,我会收到“headers ready sent”警告
- 如果我没有在每个页面上调用“session\u start()”,则$\u session变量在进入下一页时为空
我通过将“session_start()”的代码移动到我的config.php文件中,确保它是第一段代码,从而解决了这个问题(谢谢“martin先生”)
然后,对于应用程序中的每个页面,我确保这是第一行代码:
<?php
require_once("config.php");
需要解释,因为似乎不够清楚(??):
如果会话的状态为“无”,则启动会话
此外,如果您回显任何已发送的标题,则应在任何require或require_once之前调用。此外,文件的编码也会影响输出并过早地将数据发送到客户端。什么操作系统是您的服务器和开发机器。您只需确保在任何输出之前调用了session\u start()
。这意味着,如果您将一个文件包含到另一个已经调用了session\u start()
的文件中,则包含的文件不需要它。或者,您可以将所有内容都包装在ob\u start
中,但这是一种绕过它的黑客方式。使用require\u once
不会影响发送头,除非包含的文件输出任何内容。最好的办法是:去掉你的结束标记,这是人们用来防止尾随空格导致这个问题的一种做法。我尝试删除结束标记,甚至注释掉包含文件中的所有代码。那没用。但是如果我把session_start()放在tippy的顶部,就可以了。现在看看我是否能找到一种优雅的方式来包含它,或者看看我是否需要在我的应用程序中的每个文件上硬编码它。另外,开发机器是Windows,主机服务器是Linex,添加一些注释来解释您的代码将有助于改进这个答案。真的吗?代码是不言自明的!如果会话的状态为“无”,请启动它。说真的……我在低质量的事后审查队列中找到了这个答案;系统将其标记为低质量,因为没有努力解释代码。这个常数是什么?它记录在哪里?函数返回什么?它还可以返回什么其他值?快速搜索PHP_SESSION_NONE和SESSION_start()会告诉您,但由于所有内容都必须填鸭式输入,因此我编辑了我的答案。代码本身是不言自明的,但它没有解释它解决OPs问题的原因。正如马丁斯先生所说,上面的评论确实解释了这一点。
if (session_status() == PHP_SESSION_NONE) {
session_start();
}