session_start()函数如何工作?

时间:2012-03-05 00:27:35

标签: php session session-cookies

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

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

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

我检查了(使用headers_list())当我想要启动会话时服务器发回了哪些标头及其答案。其中有标题

Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8

似乎一切正常,服务器命令浏览器设置cookie。

但是。要开始会话,我必须在页面代码的开头包含session_start()函数。因此,当浏览器开始解析页面时,将启动此功能。浏览器符合php开始标记<?php,后跟session_start()函数。它立即将控制权委托给服务器。而服务器现在才启动该功能。仅当它已经将页面发送到带有所有标题的浏览器时。

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

3 个答案:

答案 0 :(得分:13)

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

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

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

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

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

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

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

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

会话完全由SAPI处理。除了将控制权降级到SAPI之外,Apache什么都不做。

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

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

在新会话(发送cookie)的情况下,客户端是否仅在页面执行后收到会话ID并不重要:它将用于下一个请求。会话ID是恢复会话数据的关键。如果有人窃取您的会话ID并且您没有服务器sode检查,那么您的会话数据将受到损害。

有关详细信息,请随时阅读another one of my answers.

答案 1 :(得分:2)

基本上会发生这种情况:

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

答案 2 :(得分:1)

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

因此,从简单的意义上讲,函数调用session_start()将告诉Web服务器保存一个带有会话ID的小文件,以及任何相关的会话数据(例如,如果你在$ _SESSION中设置了任何东西),然后使用它存储在cookie中的会话ID向客户端发送标头。这意味着服务器可以将信息与各个访问者相关联。