繁体   English   中英

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

[英]When and where should I use session_start?

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

例如,假设我有一个登录脚本,该脚本设置了一个会话变量以告知用户是否已登录。然后必须将session_start()放在脚本的顶部,还是仅在实际设置会话变量之前登录是否成功?

<?php
// session_start(); here?

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

    $_SESSION["username"] = $username;
}
?>

根据w3schools的说法,另一种情况是

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

除非您启用了输出缓冲,否则session_start() 必须在将标头以外的任何内容发送到浏览器之前进行(因为它在标头中设置了cookie)。

必须在您尝试引用$ _SESSION数据之前出现。

在您的示例中,在任何一个实例之前都没有html标记输出-因此两者都可以工作。

打开会话会有一定的成本,因此,如果您要对请求进行其他基于非会话的验证,则将session_start()推迟到这些检查通过后才能使您更灵活地抵御DOS攻击。

正如其他人所说,您必须做的绝对要求是:

  • 在读取或写入$_SESSION之前,必须运行session_start (否则它将只是一个普通数组,不会保存在任何地方)。
  • 除非您使用session_write_close将其关闭,否则在一个脚本执行(页面加载)期间,您不得运行session_start两次。

还有一条额外的规则,从技术上讲有例外,但最好将其视为绝对的:

  • 在编写任何输出( echo ,PHP块外的HTML等)之后,请勿启动会话,因为如果服务器已经开始发送内容,则PHP可能无法将cookie发送到浏览器。

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

  • PHP在打开会话时将其锁定,以避免两个进程将有冲突的数据写入会话,因此,如果一次有多个请求发生,则除非它们确实需要,否则请避免它们彼此等待。 例如,如果您正在响应AJAX请求,并且不需要会话中的任何数据,请不要打开它。
  • 正如symcbean所提到的,创建新会话需要一定的成本,因此,如果您的站点正忙于合法或恶意流量,则可能需要提供一些登录页面或错误消息而根本不启动它。

在那之后,这成为样式和体系结构的问题,但是涵盖以上大部分内容的经验法则是“如果确定页面需要,请尽快”。

在大多数情况下,在页面顶部开始会话是最好的。 但是,如果您不需要整个文档/代码的会话,则可以始终将其放置在if()子句之后,如本例所示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM