Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php session_start()函数是如何工作的?_Php_Session_Session Cookies - Fatal编程技术网

Php session_start()函数是如何工作的?

Php session_start()函数是如何工作的?,php,session,session-cookies,Php,Session,Session Cookies,请解释session\u start()函数是如何工作的 我不理解在php中启动会话时的操作顺序。试着解释一下 HTTP是一种客户机-服务器体系结构。这意味着浏览器发送其请求,服务器处理该请求并返回其答案。每个操作都有相应的标题 当我想启动会话时,我检查了(使用headers\u list())服务器返回的标题及其答案。除此之外,还有一个标题 Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8 看起来一切正常,服务器命令浏览器设置coo

请解释
session\u start()
函数是如何工作的

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

HTTP是一种客户机-服务器体系结构。这意味着浏览器发送其请求,服务器处理该请求并返回其答案。每个操作都有相应的标题

当我想启动会话时,我检查了(使用
headers\u list()
)服务器返回的标题及其答案。除此之外,还有一个标题

Set-Cookie: PHPSESSID=7f4cbf53fbcd4717792447f32da7dba8
看起来一切正常,服务器命令浏览器设置cookie


但是,要启动会话,我必须在页面代码的开头包含
session\u start()
函数。因此,当浏览器开始解析页面时,就会启动此函数。浏览器符合php开始标记
php是一种服务器端语言-它不是由浏览器解析的,而是由web服务器解析的。然后,它通过HTTP(或您可能使用的任何其他协议)将标题和内容发送到浏览器


因此,在一个简单的意义上,函数调用session_start()将告诉web服务器保存一个带有会话id的小文件和任何相关的会话数据(例如,如果您在$_session中设置了任何内容),然后向客户端发送一个带有会话id的头,该会话id存储在cookie中。这意味着服务器可以将信息与个人访问者关联。

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

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

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

然后由SAPI执行PHP。当您调用
session\u start()
时,PHP会做一些事情:

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

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

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

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

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

大多数PHP安装都启用了输出缓冲,它将所有输出(头和正文)存储到缓冲区中,直到刷新到Apache为止(可以通过
ob\u flush()
显式地,也可以在脚本末尾隐式地)

如果“输出缓冲”处于启用状态,则可以在第一次刷新之前的任何位置调用
session\u start()
,因为PHP将在正文之前发送标题

在新会话的情况下(当发送cookie时),客户机是否仅在页面执行后才收到会话ID并不重要:它将在下一个请求中收到会话ID。会话ID是还原会话数据的密钥。如果有人窃取了您的会话ID,而您没有服务器sode检查,则您的会话数据将被泄露


有关更多信息,请随意阅读

基本上是这样的:

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