session_start()函数如何工作?

Gre*_*een 4 php session session-cookies

请解释一下session_start()功能是如何工作的.

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

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

headers_list()当我想要启动会话时,我检查了(带)服务器发回的标题及其答案.除此之外还有标题

Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*ore 13

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

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

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

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

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

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

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

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

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

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

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

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

有关更多信息,请随时阅读我的另一个答案.