我刚开始学习 PHP 编程,遇到了一个稍微令人困惑的领域,Sessions 和 Cookies。
我了解服务器端和客户端存储的差异,但我看不出它们如何区分以及在什么情况下各自适合?
另外,我看到有人说 cookie 可以用来存储会话 id,这将如何完成,为什么会有优势?
感谢您的任何反馈。
我刚开始学习 PHP 编程,遇到了一个稍微令人困惑的领域,Sessions 和 Cookies。
我了解服务器端和客户端存储的差异,但我看不出它们如何区分以及在什么情况下各自适合?
另外,我看到有人说 cookie 可以用来存储会话 id,这将如何完成,为什么会有优势?
感谢您的任何反馈。
首先,让我们打破一个长期存在的神话(或者至少我认为这是一个现有的神话),即会话 cookie 与常规 cookie 不同。它不是。会话 cookie 只是一个普通的 cookie。只有已设置(或未设置)的会话 cookie 的属性通常不同。但是机制是完全一样的。
通过向浏览器发送 http 响应标头来设置 cookie:
Set-Cookie: name=value[; possible expiration-date][; other possible properties]
session-cookie 与常规 cookie 的典型区别在于没有设置过期日期(或过期日期设置为过去的日期)。这意味着浏览器将在关闭浏览器后处理 cookie。但是“常规”cookie 也可以做到这一点。因此,可以这么说,使其成为“会话 cookie”。
现在我们已经解决了这个问题;除了上述属性外,应用程序通常使用 cookie 使它们更像会话 cookie 的机制是 cookie 的值仅包含某种唯一可识别的值。也许是md5
一个sha1
散列。
每次浏览器请求服务器上的资源时,它都会沿着这个 cookie 发送(除非它已经过期),并带有如下的 http 请求标头:
Cookie: name=value
后端的会话机制(在您的情况下是 PHP)将 cookie 的唯一 ID 与存储在服务器文件系统或数据库中的文件中的数据相关联。这样,每次收到 cookie 时,它都能够检索此数据并将其链接到请求。
这样做的好处是,1) 可以隐藏敏感信息,不必通过网络传输,2) 通过将其保存在服务器上,不会最终出现在用户浏览器的 cookie 缓存中。
因此,基本上您希望在常规 cookie 中发送非敏感和非应用程序重要信息(想想:布局偏好、非持久性播放列表,例如在 YouTube 上,等等),并使用会话来存储敏感的信息。
编辑:
对不起,忽略“或到期日期设置为过去的日期”,因为它是错误的。这将导致 cookie 立即被浏览器失效,因此不再与请求一起发送。
在会话中使用 cookie 的优点是 cookie是持久的。
换句话说,当用户在几周后访问您的网站时,他们的会话很可能已经过期。但是,如果他们有一个 cookie 可以将他们唯一标识到您的脚本,那么您可以自动将他们登录并重新建立会话。
...每种情况都适合什么情况?
答案看起来像这样:
另外,我看到有人说cookie可以用来存储会话ID......
我假设这意味着在 cookie 中存储一个唯一值,该值标识他们正在使用的用户/浏览器/设备。实现这样的东西看起来像:
cookie 和会话都用于保存用户特定信息以跟踪用户。很多时候你可以使用其中任何一个,但它们有一些区别。
cookie 是保存在用户机器上的文本文件。每次用户访问您的网站时,他都会交出 cookie,让您知道他是谁。这样做的好处是信息保存在其他人的机器上,因此您不必担心。因此,您可以将其留在那里,直到奶牛回家。当/如果用户回来,他会带上信息。缺点是信息不在您的控制范围内,因为用户可以轻松地编辑您提供给他的 cookie。这使得 cookie 中的任何信息都不可信,并且每次用户将其提供给您时都必须对其进行检查。
会话类似于 cookie,只是您将信息保存在服务器上。优点是您可以信任会话以保持数据与放入时完全相同。缺点是您必须存储该信息,这意味着最终您需要丢弃它,以免您的网络服务器填满信息那永远不会被使用。
现在这有点棘手。您会看到,虽然会话的机制与我在上面描述的一样,但实际实现可能会因 PHP 的设置而异。会话数据可以保存在单独的文本文件中,也可以保存在服务器上的数据库中。您还需要某种方式来识别哪个会话对应于哪个用户。通常(但不是唯一的)方法是使用 cookie。实际情况是实际数据保留在您的服务器上并链接到唯一的会话 ID。该会话 ID 号被放在一个 cookie 上并提供给用户,以便您以后可以在他回来时查看他的数据。
当您使用会话函数时,上述过程由 PHP 自动执行;你不需要手动实现它。如果出于某种原因您需要更改会话的实现方式,您可以通过更改 php.ini 中的会话参数来实现。