会话是如何工作的?

32
有人能够解释一下 PHP 中会话(session)是如何工作的吗?例如,3 个用户登录到 Gmail,服务器如何识别这三个用户,背后的内部过程是什么?
9个回答

24

会话由两个组件构成,即客户端会话ID服务端会话数据。客户端可以将会话ID作为URL参数、cookie或甚至HTTP头信息发送到服务器。

然后,服务器使用此会话ID查找适当的会话数据并返回给客户端。

您可以通过各种session_ 函数来调整会话行为。


1
如果会话是由cookie和服务器端会话数据组成的,即使没有cookie,会话如何工作? - dendini

24

会话是服务器端会话数据和客户端cookie的组合,其中客户端cookie仅包含对服务器上正确数据的引用。因此,当用户访问网站时,其浏览器向服务器发送引用代码,服务器加载相应的数据。

这种方法可能比使用客户端cookie存储所有数据更加麻烦,但有几个优点:

  • 服务器端会话数据可以包含大量数据而无需担心 - 客户端cookie的大小受限
  • 您的客户端cookie除了一个小的引用码之外不包含任何其他内容 - 每次有人访问您网站上的页面时都会传递此cookie,通过不传输大型客户端cookie,您可以节省很多带宽
  • 会话数据更加安全 - 只有您能够操纵它,而客户端cookie可被所有人编辑

还要注意的是,会话仅在用户关闭浏览器之前持续存在,而cookie可以配置为持续更长时间。然而,除上述之外,在大多数情况下,会话数据和cookie数据没有太大区别。

这篇文章非常好地解释了PHP中会话和cookie的工作原理。


你是指服务器端的文件吗? - Your Common Sense
啊,是的,谢谢指出。我认为会话数据,就像Jacob Relkin所指出的那样,可能更有意义。我现在会进行编辑。谢谢。 - Russell Dias
@learner 这是正确的,除非PHP被设置为附加一个丑陋的 PHPSESSID GET变量。 - alex
@RusselDias 我想指出一件事情... 当你说“只有你能够操作它”时,这并不是100%正确的。任何可以访问你的tmp文件夹的人也可以操作它(比如共享主机)。更改会话保存路径http://php.net/manual/en/function.session-save-path.php是个好主意。 - alex
如果用户关闭了浏览器,服务器如何知道删除会话? - Aditya M P
1
@AdityaMP 您有一个会话超时(session.gc_maxlifetime),如果会话不活动一段时间,会删除会话。 - Kevin Fee

11

会话非常简单。

当我登录您的网站时,PHP将使用“会话ID”设置标准浏览器cookie,通常是类似于63f1a67cf52b5d2bbd0cbef45e18b242的字母数字字符串。

所有 cookie 一样,我的浏览器将在每个请求中向您的服务器发送该cookie。因此,您的应用程序现在知道,带有63f1a67cf52b5d2bbd0cbef45e18b242会话ID的每个请求都来自于我。

因此,如果您需要存储有关我的任何信息,可以在63f1a67cf52b5d2bbd0cbef45e18b242下进行跟踪。默认情况下,PHP将此信息存储在/tmp/目录中的文件中,但您可以覆盖它并将其存储在任何地方(例如,在数据库中)。重要的是将会话ID与特定用户相关联。

我不想过于简化事物。存在一些问题(例如,如果入侵者看到了未加密的会话ID并开始使用它本人,他可能会开始冒充我),并且有一些方法可以缓解这些问题。但是,将会话ID存储在cookie中并使用该ID来识别存储在服务器上关于我的信息的基本机制是相当普遍的。


1
先生,如果我禁用浏览器的Cookie会发生什么? - DEVOPS
1
通常情况下,您将无法使用会话。PHP确实有一个设置,可以在将链接写入页面时自动重写链接,以包括会话ID作为额外参数,这当然不需要cookie,但需要PHP在生成内容时解释您的内容(这应该感觉有点可怕)。 - VoteyDisciple
先生,服务器如何识别每个用户的请求?它会保存在哪里吗? - DEVOPS
1
服务器通过存储在cookie中的值来识别请求。请记住,所有cookie都随所有请求一起传输。信息保存在服务器上取决于您。正如我所提到的,PHP默认情况下将其存储在/tmp/文件中。 - VoteyDisciple

5

我认为Gmail使用的是Python而不是PHP。

PHP默认将其会话写入/tmp目录。可以将其配置为在数据库中存储会话。

它通过cookie标识会话,但也可以配置为传递查询字符串,但这样做很丑陋。


2

PHP会话的工作原理是什么

  • 首先,PHP会为每个会话创建一个唯一的标识符(32个十六进制数字的随机字符串,例如3c7foj34c3jj973hjkop2fc937e3443)。

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

  • 服务器上创建了一个新文件,该文件名与唯一标识号相同,并带有sess_前缀(即sess_3c7foj34c3jj973hjkop2fc937e3443)。

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

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

当用户关闭浏览器或离开网站时,会话终止。 服务器还会在预定的会话时间结束后终止会话。 这些是PHP处理会话所使用的简单机制。 希望本文可以帮助您了解PHP SESSION的工作原理。

有关更多详细信息,请参见此文章。 PHP会话的工作原理是什么


1

在header顶部定义session_start()函数...这将生成一个唯一的编号。Session是与服务器通信的方式。Session存储在服务器端和客户端。浏览器将会话存储在tmp文件或cookie中。

Cookie保留会话名称和值,但不保存会话数据。数据由服务器端的session保存。当客户端向服务器发送请求时...服务器获取会话ID并将数据返回给客户端。Session ID是由服务器端生成的标识请求来源的方式。


1
当第一次打开一个网页(URL)时,您的浏览器会向该服务器发送请求,此时,头部不包含任何cookie或会话,然后,服务器响应Web浏览器(用户代理),此时,服务器可能会发送cookie或会话,此时,浏览器将它们保存以便下一次请求。
现在,重新加载页面时,浏览器会将cookie发送回服务器(包含在请求的标头中),然后,服务器可以访问并验证它。
对于会话:它是一个临时cookie,在关闭窗口后将被终止。
PHP SESSION PHP使用会话cookie来存储一个名为 PHPSESSID 的键值对,服务器依赖于此键的值,并使用PHPSESSID的值查找等效的键值对。使用这种方法可以防止某些攻击,如解密cookie的实际值,因为cookie将所有键值对保存在客户端PC中,而会话取决于一个键值对。

0
一个cookie。
或者是url中的参数。 这个互联网过程被称为HTTP协议。

0

session_start()函数会生成一个随机的会话ID,并将其存储在用户计算机上的cookie中(这是实际存储在客户端的唯一会话信息)。默认的cookie名称是PHPSESSID,尽管在服务器上的PHP配置文件中可以更改此名称(大多数托管公司通常不会更改它)。要在您的PHP代码中引用会话ID,您需要引用变量$PHPSESSID(它是一个cookie名称;还记得Cookies吗?) 聪明的你可能想知道当您第二次通过页面并到达session_start()函数时会发生什么。PHP知道已经存在一个会话,因此会忽略后续的session_start()函数。


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