HTTP 是无状态协议是有原因的。会话将状态焊接到 HTTP。根据经验,避免使用会话状态。
更新:在 HTTP 级别没有会话的概念;服务器通过给客户端一个唯一的 ID 并告诉客户端在每次请求时重新提交它来提供这一点。然后服务器使用该 ID 作为 Session 对象的大哈希表的键。每当服务器收到请求时,它都会根据客户端随请求提交的 ID 从会话对象的哈希表中查找会话信息。所有这些额外的工作都是对可扩展性的双重打击(HTTP 是无状态的一个重要原因)。
- Whammy One:它减少了单个服务器可以做的工作。
- 重击之二:这使得扩展变得更加困难,因为现在您不能只将请求路由到任何旧服务器 - 它们并不都有相同的会话。您可以将具有给定会话 ID 的所有请求固定到同一服务器。这并不容易,而且是单点故障(不是针对整个系统,而是针对大部分用户)。或者,您可以在集群中的所有服务器之间共享会话存储,但现在您有更多的复杂性:网络附加内存、独立会话服务器等。
鉴于所有这些,您在会话中输入的信息越多,对性能的影响就越大(正如 Vinko 指出的那样)。正如 Vinko 指出的那样,如果您的对象不可序列化,则会话将行为不端。因此,根据经验,避免在会话中放置超过绝对必要的内容。
@Vinko您通常可以通过在您发回的响应中嵌入您正在跟踪的数据并让客户端重新提交它来解决服务器存储状态的问题,例如,将数据发送到隐藏的输入中。如果您真的需要服务器端状态跟踪,它可能应该在您的后备数据存储中。
(Vinko 补充说:PHP 可以使用数据库来存储会话信息,并且让客户端每次重新提交数据可能会解决潜在的可扩展性问题,但会带来一大堆安全问题,您必须注意现在客户端控制所有您的国家)