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