【问题标题】:When and where should I use session_start?我应该在何时何地使用 session_start?
【发布时间】:2017-08-25 18:56:57
【问题描述】:

在 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()一次。多次调用会报错。
  • @u_mulder 我添加了一个额外的想法
  • @super w3schools 因提供错误信息而臭名昭著。没有理由认为它必须是您文档中的第一件事。唯一重要的是它出现在任何页面内容发送之前,无论是 HTML 还是其他任何内容。

标签: php session


【解决方案1】:

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

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

有一个额外的规则,从技术上讲有例外,但最好被视为绝对规则:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    打开会话需要花费一些成本,因此,如果您要对请求进行额外的、非基于会话的验证,那么将 session_start() 推迟到这些检查通过后,您对 DOS 攻击的抵抗力会更强。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 用额外的想法编辑了问题
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 2017-12-12
        • 2019-01-22
        • 2013-12-16
        相关资源
        最近更新 更多