【问题标题】:How session_start() function works?session_start() 函数是如何工作的?
【发布时间】:2012-03-22 13:07:12
【问题描述】:

请解释一下session_start() 函数的工作原理。

我不明白在 php 中启动会话时的操作顺序。试着解释一下。

HTTP 是一种客户端-服务器架构。这意味着浏览器发送它的请求,服务器处理请求并返回它的答案。这些动作中的每一个都有适当的标题。

当我想开始会话时,我检查了(使用headers_list())服务器会发送回哪些标头及其答案。除其他外,还有标题

Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8

看来一切正常,服务器下令浏览器设置cookie。

但是,要开始会话,我必须在页面代码的开头包含 session_start() 函数。所以这个函数是在浏览器开始解析页面的时候启动的。浏览器遇到 php 开始标签 <?php 后跟 session_start() 函数。它立即将控制权委托给服务器。并且服务器现在才启动该功能。仅当它已经将页面连同所有标题一起发送到浏览器时。

所以我不明白服务器如何在浏览器开始解析页面并满足session_start()功能之前发送Set-Cookie标头?它怎么知道必须在命令session_start() 执行之前放置Set-Cookie 标头?还是我误解了流程?

【问题讨论】:

    标签: php session session-cookies


    【解决方案1】:

    我将使用 Apache 作为服务器来回答。

    当向服务器请求页面时,Apache 将其路由到正确的文档。

    如果该特定文档类型与 SAPI 相关联,则控制权归于该 SAPI。对于 PHP 脚本,这通常是 PHP 的 Apache 模块。

    然后您的 PHP 将由 SAPI 执行。当你调用session_start() 时,PHP 会做一些事情:

    • 它检查客户端是否发送了一个以session_name()命名的cookie。该 cookie 包含会话 ID。如果它不存在,它会使用新的会话 ID 创建它。

    • 它从会话提供程序加载与该会话 ID 关联的会话数据(默认提供程序将会话数据作为包含序列化会话数据的文件存储在服务器的临时文件夹中)并使其在 @987654324 中可用@超级全球。

    • 它注册一个关闭回调以通过提供程序将会话数据保存回来。

    然后您的脚本继续其正常的执行流程,将输出发送回 Apache 以发送到客户端。

    会话完全由 SAPI 处理。 除了将控制权交给 SAPI,Apache 什么也不做。

    大多数 PHP 安装都启用了输出缓冲,它将所有输出(标头和正文)存储到缓冲区中,直到它被刷新到 Apache(通过 ob_flush() 显式或在脚本末尾隐式)。

    如果输出缓冲打开,您可以在第一次刷新之前的任何地方调用session_start(),因为 PHP 会在正文之前发送标头。

    在新会话的情况下(发送 cookie 时),客户端是否仅在页面执行后才收到会话 ID 无关紧要:它会在下一次请求时获得它。会话 ID 是恢复会话数据的关键。如果有人窃取了您的会话 ID,而您没有进行服务器端检查,您的会话数据将受到损害。

    欲了解更多信息,请随时阅读another one of my answers.

    【讨论】:

      【解决方案2】:

      基本上是这样的:

      • 客户端请求一个页面,并发送 URL 和它拥有的任何 cookie
      • PHP 调用start_session
      • PHP 检查会话 cookie 是否存在,如果不存在则创建一个

      【讨论】:

        【解决方案3】:

        PHP 是一种服务器端语言 - 它不是由浏览器解析,而是由您的 Web 服务器解析。然后它通过 HTTP(或您可能使用的任何其他协议)将标头和内容发送到浏览器。

        所以,简单来说,函数调用 session_start() 将告诉 Web 服务器保存一个带有会话 ID 的小文件,以及任何相关的会话数据(例如,如果您在 $_SESSION 中设置了任何内容),然后将带有会话 ID 的标头发送到客户端,该会话 ID 存储在 cookie 中。这意味着服务器可以将信息与单个访问者相关联。

        【讨论】:

          猜你喜欢
          • 2010-12-27
          • 2014-10-16
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          • 2020-07-18
          • 2015-11-08
          • 2017-05-21
          • 2011-04-24
          相关资源
          最近更新 更多