我应该在何时何地使用session_start?

时间:2017-08-24 19:58:55

标签: php session

我应该在PHP中何时何地使用session_start()

例如,假设我有一个登录脚本,它设置一个会话变量来判断用户是否已登录。我必须将session_start()放在脚本的顶部,或者只是在我之前如果登录成功,实际上设置会话变量?

<?php
// session_start(); here?

if (login($username, $password)) {
    // session_start(); or here?

    $_SESSION["username"] = $username;
}
?>
根据w3schools的说法,另一个案例就是这个。

  

注意: session_start()函数必须是文档中的第一件事。在任何HTML标记之前。

4 个答案:

答案 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

您可能希望避免启动会话有两个原因:

  • PHP会在您打开会话时锁定会话,以避免两个进程将冲突数据写入其中,因此如果您同时发生多个请求,您希望避免它们彼此等待,除非他们确实需要。例如,如果您回复了AJAX请求,并且不需要会话中的任何数据,请不要打开它。
  • 正如symcbean所述,创建新会话需要一些费用,因此如果您的网站忙于合法或恶意流量,您可能希望提供一些目标网页或错误消息而不启动它。

在那之后,它变成了风格和架构的问题,但是如果您确定页面需要它,那么尽快覆盖上述大部分内容的经验法则是&#34;

答案 2 :(得分:0)

在页面顶部开始会话大部分时间是最好的。但是如果你不需要整个文档/代码的会话,你可以总是把它放在if()子句之后,就像在这个例子中一样。

答案 3 :(得分:0)

session_start()函数可以在代码中的任何位置。您应该将它放在文档的开头以保持一致性并将其称为一天。如果您在所有登录/数据库驱动的页面上都有一个单独的数据库或配置文件,则应将其放在那里,这样您就不必将其重新编码到每个页面中。

相关问题