请解释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()
标头?或者我误解了这个过程?
答案 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)
基本上会发生这种情况:
start_session
答案 2 :(得分:1)
PHP是一种服务器端语言 - 它不是由浏览器解析,而是由您的Web服务器解析。然后,它通过HTTP(或您可能正在使用的任何其他协议)将标头和内容发送到浏览器。
因此,从简单的意义上讲,函数调用session_start()将告诉Web服务器保存一个带有会话ID的小文件,以及任何相关的会话数据(例如,如果你在$ _SESSION中设置了任何东西),然后使用它存储在cookie中的会话ID向客户端发送标头。这意味着服务器可以将信息与各个访问者相关联。