PHP会话是如何工作的?

148
会话文件通常存储在服务器上的/tmp/目录下,命名为sess_{session_id}。我一直在查看内容,但无法弄清楚它们是如何工作的。
从文件中获取变量名和内容很容易。但是PHP如何知道哪个会话属于谁呢?
session_id似乎完全是随机的,一个IP地址可以有多个用户,每个用户如果打开了多个浏览器窗口,还可以有多个会话。
那么它是如何工作的呢?

请查看https://dev59.com/CnRB5IYBdhLWcg3wv5xA - KV Prajapati
4个回答

226
一般情况下:
  • 当用户的会话创建时,会话ID会发送给用户。
  • 会话ID存储在名为PHPSESSID的cookie中(默认情况下)。
  • 浏览器会在每次请求时将该cookie发送到服务器。
  • 服务器(PHP)使用包含会话ID的cookie来确定哪个文件对应于该用户。
会话文件中的数据是$_SESSION的内容,经过序列化处理(即用像serialize这样的函数表示为字符串);当PHP加载文件以填充$_SESSION数组时,会进行反序列化。
有时会话ID不会存储在cookie中,而是通过URL发送--但这种情况现在相当少见。
有关更多信息,请查看手册中的Session Handling部分,其中提供了一些有用的信息。
例如,有关传递会话ID的页面解释了如何使用cookie或URL将会话ID从页面传递到页面,以及可能会影响此过程的配置选项。

6
移动设备(来自本机应用程序)通常如何处理会话?存储会话ID吗?还是这正是OAuth出现的地方? - Adam Waite
那么你的意思是PHP会话是由服务器端管理的,而且不应该期望在浏览器的“会话存储”中看到会话变量本身被识别出来? - Dan Chase

30

PHP会话如何工作

  • 首先,PHP创建一个16字节长的唯一标识符号(以32个十六进制字符的字符串形式存储,例如a86b10aeb5cd56434f8691799b1d9360)用于单个会话。

  • PHPSESSID cookie将该唯一标识号传递给用户的浏览器以保存该编号。

  • 在服务器上创建一个与唯一标识符号相同名称的新文件,其中包含sess_前缀(即sess_a86b10aeb5cd56434f8691799b1d9360)。

  • 浏览器使用每个请求发送该cookie到服务器。

  • 如果PHP从PHPSESSID cookie中获取到该唯一标识符号(每个请求都会获取),则PHP会搜索临时目录并将该号码与文件名进行比较。 如果两者相同,则检索现有会话,否则为该用户创建新会话。

当用户关闭浏览器或离开网站时,会话被销毁。 服务器还会在预定的会话时间到期后终止会话。 这些是处理会话的PHP使用的简单机制步骤。希望本文能帮助您了解PHP SESSION是如何工作的。


但是,如果我已经登录到某个网站(也就是说,在一个会话中),并打开一个新的选项卡mysite.com/cart。我也会得到我的“你好Joe Doe,5条消息,这是你的购物车清单...”即会话信息。- 但是为什么浏览器在发送GET请求时会将任何Session-ID与其一起发送给这个空白选项卡呢?快速更新:啊,找到答案了:+) - Frank N
我可以问一下,会话 ID 如何提供安全性?例如,如果用户登录并进入其个人资料,然后更改 URL 参数以访问其他用户的个人资料,会话 ID 如何防止这种情况发生? - Andrewboy

4
会话ID确实是随机的,并且根据配置在cookie或URL中传递。您可能已经在某些URL中看到了PHPSESSID = xxxx,该名称也有一个cookie。

2
在PHP中,会话是通过使用session_start()函数来启动的。与setcookie()函数一样,session_start()函数必须出现在页面上的任何HTML之前,包括空行。代码将如下所示: <?php session_start();?><html><head> .......等等 session_start()函数生成一个随机会话ID,并将其存储在用户计算机上的一个cookie中(这是实际存储在客户端的唯一会话信息)。 cookie的默认名称为PHPSESSID,虽然可以在服务器上的PHP配置文件中更改它(但大多数托管公司都不会更改它)。因此,在您的PHP代码中引用会话ID,您将引用变量$PHPSESSID(这是一个cookie名称; 您还记得从Cookies中吗?)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接