我应该何时何地使用 session_start?

5 php session

我到底应该在何时何地使用session_start()PHP?

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

<?php
// session_start(); here?

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

    $_SESSION["username"] = $username;
}
?>
Run Code Online (Sandbox Code Playgroud)

另一种情况是这样的,根据w3schools

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

IMS*_*SoP 8

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

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

有一条额外的规则在技术上有例外,但最好视为绝对的:

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

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

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

之后,它就变成了风格和架构的问题,但涵盖上述大部分内容的经验法则是“如果您确定页面需要它,请尽快”。