3

我不久前查过这个,它对我来说仍然很模糊。当我使用它时,我想知道以下关于会话的事情是否正确:$_SESSION['username'] = "pete";

  • $_SESSION是一个全局变量,只能在服务器上更改
  • 何时$_SESSION['username']声明 cookie 将在客户端设置
  • 这意味着客户端可以查看数据但不能编辑它
  • 何时$_SESSION['username']声明 cookie 也将在服务器端设置

如果第三个陈述为真,那么为什么我登录后找不到包含用户名的 cookie?我确实找到了一个会话 cookie,但它包含一个类似tkcsq66lucpra9m7j3ogqol5h7. 现在还不是一个名字是吗?

4

3 回答 3

15

$_SESSION是一个全局变量,只能在服务器上更改

这是一个超级全局的……但是在脚本执行之间填充了保存的数据。

何时$_SESSION['username']声明 cookie 将在客户端设置

不会。会话开始时会创建一个 cookie(除非设置已被修改)

这意味着客户端可以查看数据但不能编辑它

不,cookie 包含会话 ID,而不是数据

何时$_SESSION['username']声明 cookie 也将在服务器端设置

Cookie 仅存储在客户端上。数据将存储在服务器上,并将与存储在发送到浏览器的 cookie 中的标识符相关联。

如果第三个陈述为真,那么为什么我登录后找不到包含用户名的 cookie?

这不是真的。

我确实找到了一个会话 cookie,但它包含类似 tkcsq66lucpra9m7j3ogqol5h7 的代码。

那是标识符。

如果您自己构建会话系统(而不是使用 PHP 的内置库),那么您可能会在数据库中存储类似这样的内容:

session                     key       value
tkcsq66lucpra9m7j3ogqol5h7  username  pete

然后,会话库可以在会话开始时填充$_SESSION"username" => "pete"并在其中接收到 cookie sessionId=tkcsq66lucpra9m7j3ogqol5h7

PHP 的内置系统不是那么便宜和讨厌(而且它是透明的,所以你不需要担心实现细节)。

于 2013-01-04T22:47:56.117 回答
0

cookie 中的这个字符串“tkcsq66lucpra9m7j3ogqol5h7”是会话标识符。所有$_SESSION数据只能由服务器访问。

于 2013-01-04T22:49:13.823 回答
0

客户端的 cookie 是对服务器端会话内容的引用,无论是用于存储会话的存储机制。

因此,如果您的会话设置将会话数据存储在文件中,那么您的服务器上的某处将有一个名为 tkcsq66lucpra9m7j3ogqol5h7 的文件,其中包含会话数据(或者,如果您将 memcached 用于会话数据,那么将有一个带有该会话密钥的 memcached 密钥)。

于 2013-01-04T22:51:29.680 回答