PHP会话如何工作?(不是“如何使用?”)


127

会话文件通常存储在(例如)/tmp/服务器上,并命名为sess_{session_id}。我一直在查看内容,但无法弄清楚它们是如何工作的。

从文件中获取变量名称和内容很容易。但是PHP如何知道哪个会话属于谁?

session_id似乎是完全随机的,一个IP地址可以有多个用户,并且每个用户打开多个浏览器窗口时可以有多个会话。

那么它是怎样工作的?


Answers:


202

在一般情况下:

  • 会话ID在用户创建会话后发送给用户。
  • 它存储在cookie中(默认情况下称为PHPSESSID
  • Cookie随每个请求由浏览器发送到服务器
  • 服务器(PHP)使用包含session_id的cookie来知道哪个文件对应于该用户。

会话文件中的数据是$_SESSION序列化的内容(即表示为字符串-具有诸如serialize的功能);并且在PHP加载文件时未序列化以填充$_SESSION数组。


有时,会话ID不会存储在Cookie中,而是也会通过URL发送-但这在当今很罕见。


有关更多信息,您可以查看手册的“ 会话处理”部分,其中提供了一些有用的信息。

例如,有一个有关传递会话ID的页面,该页面解释了如何使用Cookie或URL 在会话之间传递会话ID,以及哪些配置选项对此产生了影响。


5
移动设备(通过本地应用程序)如何正常处理会话?是否存储会话ID?还是OAuth出现了?
亚当·韦特

13

PHP会话如何工作

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

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

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

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

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

当用户关闭浏览器或离开站点时,会话将被破坏。在会话时间的预定时间段到期后,服务器还将终止会话。这些是PHP用于处理会话的简单机制步骤。希望本文对您有所帮助,以帮助您了解PHP SESSION的工作方式。

有关更多详细信息,请参见本文。PHP会话如何工作


但是,例如,如果我登录到某个站点(又称会话中),然后打开一个新标签mysite.com/cart。我还将获得“ Hello Joe Doe,5条消息,这是您的购物车列表...”又名会话信息。–但是,关于该空白选项卡的浏览器为什么会发送任何Session-ID以及GET-Request?快速更新:啊,找到答案了:+)
Frank Nocke

我可以问一下会话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名称;还记得Cookie中的名称吗?)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.