请解释session_start()函数的工作原理.
我不明白在php中启动会话时的操作顺序.试着解释一下.
HTTP是一种客户端 – 服务器架构.这意味着浏览器发送其请求,服务器处理请求并发回其答案.每个操作都有适当的标题.
我检查了(使用headers_list())当我想要启动会话时,服务器发回了什么标题.除此之外还有标题
Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8
似乎一切正常,服务器命令浏览器设置cookie.
但是.要启动会话,我必须在页面代码的开头包含session_start()函数.因此,当浏览器开始解析页面时,将启动此功能.浏览器符合php开始标记
所以我不明白服务器如何在浏览器开始解析页面并满足session_start()函数之前发送Set-Cookie标头?如何知道它必须在执行命令session_start()之前放置Set-Cookie标头?或者我误解了这个过程?
解决方法:
我将使用Apache作为服务器来回答.
当向服务器请求页面时,Apache将其路由到正确的文档.
如果该特定文档类型与SAPI相关联,则控制权将降级为该SAPI.对于PHP脚本,这通常是PHP的Apache模块.
然后,您的PHP将由SAPI执行.当你调用session_start()时,PHP会做一些事情:
>它检查客户端是否发送了以session_name()命名的cookie.该cookie包含会话ID.如果它不存在,则使用新的会话ID创建它.
>它从会话提供程序加载与该会话ID关联的会话数据(默认提供程序将会话数据存储在服务器的temp文件夹中,作为包含序列化会话数据的文件),并使其在$_SESSION超级全局中可用.
>它注册一个关闭回调,以通过提供程序保存会话数据.
然后您的脚本继续其正常的执行流程,输出将被发送回Apache以发送到客户端.
会话完全由SAPI处理.除了将控制权降级到SAPI之外,Apache什么都不做.
大多数PHP安装都有输出缓冲,它将所有输出(标题和正文)存储到缓冲区中,直到它被刷新到Apache(显式地通过ob_flush()或隐式地在脚本的末尾).
如果输出缓冲打开,您可以在第一次刷新之前的任何地方调用session_start(),因为PHP将在主体之前发送标头.
在新会话(发送cookie)的情况下,客户端是否仅在页面执行后收到会话ID并不重要:它将用于下一个请求.会话ID是恢复会话数据的关键.如果有人窃取您的会话ID并且您没有服务器sode检查,那么您的会话数据将受到损害.
标签:php,session,session-cookies
来源: https://codeday.me/bug/20190714/1455833.html