我应该在PHP中何时何地使用session_start()
?
例如,假设我有一个登录脚本,它设置一个会话变量来判断用户是否已登录。我必须将session_start()
放在脚本的顶部,或者只是在我之前如果登录成功,实际上设置会话变量?
<?php
// session_start(); here?
if (login($username, $password)) {
// session_start(); or here?
$_SESSION["username"] = $username;
}
?>
根据w3schools的说法,另一个案例就是这个。
注意: session_start()函数必须是文档中的第一件事。在任何HTML标记之前。
答案 0 :(得分:2)
除非您启用了输出缓冲,否则session_start()必须才能将除标题以外的任何内容发送到浏览器(因为它在标题中设置了Cookie)。
在您尝试引用$ _SESSION数据之前必须。
在您的示例中,在任一实例之前都没有输出html标记 - 因此两者都可以。
打开一个会话有一些成本,所以如果你正在对请求进行额外的非会话验证,那么推迟session_start()
直到这些检查已经过去确实可以让你对DOS攻击有更多的反应。
答案 1 :(得分:2)
正如其他人所说,必须所做的绝对要求是:
session_start
之前,您必须运行$_SESSION
(否则它只是一个普通的数组而不会保存在任何地方)。session_start
两次,除非您使用session_write_close
将其关闭。有一条额外的规则在技术上有例外,但最好被视为绝对:
echo
,PHP块外的HTML等)之后,不要启动会话,因为如果服务器已经开始发送内容,PHP可能无法向浏览器发送cookie 您可能希望避免启动会话有两个原因:
在那之后,它变成了风格和架构的问题,但是如果您确定页面需要它,那么尽快覆盖上述大部分内容的经验法则是&#34;
答案 2 :(得分:0)
在页面顶部开始会话大部分时间是最好的。但是如果你不需要整个文档/代码的会话,你可以总是把它放在if()子句之后,就像在这个例子中一样。
答案 3 :(得分:0)
session_start()函数可以在代码中的任何位置。您应该将它放在文档的开头以保持一致性并将其称为一天。如果您在所有登录/数据库驱动的页面上都有一个单独的数据库或配置文件,则应将其放在那里,这样您就不必将其重新编码到每个页面中。