【发布时间】:2011-01-15 11:34:03
【问题描述】:
会话变量和 cookie 对我来说似乎很相似。我了解技术上的差异,但您如何决定何时使用一种与另一种?
【问题讨论】:
标签: http cookies session-variables
会话变量和 cookie 对我来说似乎很相似。我了解技术上的差异,但您如何决定何时使用一种与另一种?
【问题讨论】:
标签: http cookies session-variables
会话存储在服务器上,这意味着客户端无法访问您存储的有关它们的信息。存储在您的服务器上的会话数据不需要与每个页面一起完整传输;客户端只需要发送一个ID,数据就会从服务器加载。
另一方面,cookie 存储在客户端上。它们可以长期耐用,并且当您拥有一组 Web 服务器时,它们可以让您更顺畅地工作。但是,与会话不同的是,存储在 cookie 中的数据会随每个页面请求完整传输。
避免在 cookie 中存储数据
您可以在会话数据中存储的内容取决于您拥有的数据量和用户数量。 no_of_users * size_of_session_data 必须小于服务器上的可用内存。
【讨论】:
【讨论】:
大多数时候,会话状态是使用 cookie 保持的。所以这不是一个或另一个的问题,而是如何一起使用它们。
使用框架的会话基础架构可能会使事情变得更容易,但使用 cookie 手动跟踪状态通常可以让您进行更精细的控制。正确的解决方案取决于您要完成的任务。
【讨论】:
Cookie 可以比单个会话保留更长的时间。但是,cookie 也可能被用户删除,或者您的用户的浏览器不接受 cookie(在这种情况下,只有服务器端会话可以工作)。
【讨论】:
Cookie 是客户端,会话是服务器端。
将 cookie 用于您可以信任用户的小块数据(如字体设置、网站主题等),以及用于服务器端数据的不透明 ID(如会话 ID)。预计这些数据可能随时丢失并且无法信任(即需要清理)。
将会话数据用于更大的数据块(因为许多系统可以存储对象、数据结构等)以及您必须信任的数据块 - 例如授权状态等。通常,使用会话数据来存储更大的状态数据。
您也可以在 cookie 中存储诸如授权状态之类的内容,如果 GUI、缓存等需要它的话 - 但永远不要相信它,也永远不要依赖它的存在。 Cookie 易于删除且易于伪造。会话数据更难伪造,因为您的应用程序控制它。
【讨论】:
PHP 会话的一个缺点是会话处理的工作方式。具体来说,一次只有一个进程/请求可以打开一个会话以供写入。当
session_start()
会话文件被锁定。如果出现更多进程,其余进程就会堆积起来等待轮到它们。
换句话说,如果您在页面上使用 AJAX 来更新多个元素 - 您不希望 AJAX 请求打开同一个会话 - 它们将被强制进入队列,如果其中一个请求被卡住 - 它不会释放会话 - 导致浏览器挂起,打开新选项卡或窗口只会将另一个无法填充的请求放入服务器上的队列中。使用
session_write_close()
尽快释放会话是部分解决方法。
用户厌烦并打开更多窗口的长时间运行请求可能具有相同的浏览器挂起效果。
我建议避免使用 PHP 会话。
【讨论】:
Cookie 会在每次请求时发送到服务器,因此如果您计划存储大量数据,请将其存储在会话中。
否则,如果您要存储少量数据,则使用 cookie 就可以了。
任何敏感数据都应存储在会话中,因为 cookie 并非 100% 安全。 cookie 的一个优点是您可以节省服务器上通常用于存储会话数据的内存。
【讨论】:
会话存储在服务器上。如果您将某些内容存储在 cookie 中,则用户的浏览器会随每个请求发送该信息,从用户的角度来看,这可能会降低您的网站速度。我尽量避免使用 cookie。
【讨论】:
仅当数据对于 cookie 而言太大或数据太大以至于使用 cookie 会降低性能时才使用会话。
例如,如果您在 cookie 中保存的数据比会话 ID 的大小要小,例如两个登录令牌或类似的东西……那么我不明白您为什么要使用会话而不是 cookie。
另请注意,PHP 会话文件默认保存到磁盘,而 cookie 仅保存在客户端。
【讨论】:
会话存储在服务器端。如果访问者在 cookie 中存储了某些内容,浏览器将针对每个请求发送用户信息。
这往往会消耗大量服务器计算机时间并降低用户体验。一些浏览器也不支持 cookie,这让会话比 cookie 更有优势……我强烈推荐会话。
这可能会有所帮助:Cookies (php.net)
【讨论】:
您的明确指南
注意- cookie 存储在用户的浏览器中,session 存储在您的托管服务器计算机上。
何时使用
使用 cookie 如果您希望您的应用程序始终记住用户的数据,即使他们已经关闭了浏览器。例如,每当您键入 www.facebook.com 时,它都会将您带到您的帐户,即使您的浏览器已关闭并重新打开。
因为一旦您关闭浏览器,会话中保存的所有数据都会被清除。
使用 cookie 当要存储的用户信息远大于正常时。 ... 对于会话,如果您拥有更大的用户群,例如 Facebook,请考虑将所有用户会话存储在主机上的样子。
使用会话,当要存储的用户信息不大于正常时,并且您不希望公众访问您的用户变量...
【讨论】:
会话和 cookie 完全不同。 Cookies 是客户端。会话是服务器端的。会话通常(但不一定)使用 cookie 将一个请求与来自同一用户的另一个请求相关联,以识别它们属于同一会话。
会话是一个人为的概念,HTTP 没有这个概念。它由 Web 服务器创建,用于帮助 Web 开发人员跨请求携带信息,例如用户帐户信息、购物车、表单数据等。cookie 由标准 HTTP 标头携带。
您在会话和 cookie 中存储的信息取决于您。通常,您将希望在用户关闭他/她的浏览器后跨会话保留的内容放入 cookie 中。也许记住身份验证令牌以实现“记住我”功能,或者记住过去的用户活动以个性化他/她的体验。保持这些信息小而“参考”,即它可能只是引用您在服务器端存储的更丰富信息的 ID。请记住,客户端更容易受到恶意软件的攻击,因此不要存储密码或敏感信息。
最后,还有你没有提到的本地存储。这也是客户端,但可以说不太容易受到跨站点脚本攻击,因为与 cookie 数据不同,它不会在标头中自动发送。
【讨论】: