将用户会话变量存储在文件与数据库中

Posted

技术标签:

【中文标题】将用户会话变量存储在文件与数据库中【英文标题】:Storing user session variables in file vs in database 【发布时间】:2011-09-01 14:36:06 【问题描述】:

我有一个 php 应用程序,我正在使用 $_SESSION 本身为用户保存会话变量。将其存储在数据库中有什么特别的好处吗?

我正在寻找一篇可靠的/经过充分研究的文章,该文章对此进行了更多讨论。我还没有找到任何东西。

【问题讨论】:

您当前的实现有问题吗?如果不是,这不会让我觉得这是一个 SO 类型的问题。据我了解,我们是来解决问题的,而不是讨论假设的好处。如果前者适用,了解您遇到的实际问题会很有帮助。 @Jeff Parker 同意这更适合programmers.stackexchange.com 【参考方案1】:

将数据存储在数据库中的好处是,只要您希望数据存在,数据就会存在。

您的浏览器将根据会话的设置方式销毁会话,这使其有点不可靠。但是,我还找不到关于此的文章,但这是我在这种情况下使用的约定。

任何需要长期存储的数据,例如我存储在数据库中的用户详细信息和活动。任何仅与当前工作空间相关的数据,例如登录站点和发布一些 cmets 等,都可以存储在会话中。例如,我将用户身份验证详细信息存储在会话中,以不断检查用户是否已登录以及是否将他/她重定向到正确的页面。

这在检查整个应用程序的访问权限时会产生奇迹。

对我来说,将用户详细信息存储在数据库中要安全得多,因为它不能像 $_SESSION 那样被公开访问。

如果你愿意,请不同意我的看法。

【讨论】:

那么 $_SESSION 究竟是如何被公开访问的?【参考方案2】:

我会说存储在数据库中更好。因为

    当您使用共享主机托管您的网站时 PHP 使用相同的路径为所有用户存储会话,而不是在您的文件夹中。

    您可以轻松跟踪用户及其状态。

    对于在多台服务器上运行的应用程序,您可以存储 一个数据库中的所有会话数据。

This 文章可能会有所帮助。

【讨论】:

当您必须为每个请求进行验证时,将身份验证令牌存储在数据库中可能会影响应用性能。【参考方案3】:

嗯,这是一个古老的问题。就我个人而言,我从我那个时代学到的东西。除非您的站点开始大规模蓬勃发展,否则您需要开始为系统的各个方面使用多个服务器,例如运行许多镜像系统的负载平衡。或者需要为过度填充的系统稍微提高性能,使用数据库相关会话或基于文件的会话的好处确实没有任何不同。当然,我可能是错的,这只是我个人对我自己经验的看法。就像你一样,我从来没有真正找到任何文章、帖子,以及其他真正将两者并排测试的东西,我什至认为我没有找到任何真正独立测试的东西。就我个人而言,我只是根据需要(或客户的愿望)去做,通常我只是坚持基于本机会话文件。

我听说他们可以被欺骗,但迄今为止还没有看到任何证据证明这一观点。所以除了这个潜力之外,我坚持基于文件。除非我使用像代码点火器这样的系统,否则会话似乎可以处理更好的数据库驱动而不是不使用它。

【讨论】:

【参考方案4】:

在某个时间点,您将不得不在会话中存储一些内容。无论是所有会话变量还是只是会话表中一行的 ID。在这种情况下,更改存储在严重加密会话中的 ID 并劫持不同的会话是相当容易的。

考虑一下:

完整会话选项。它存储了用户 ID、用户名和加密和散列密码,以便每次调用页面时都会验证我的登录。要劫持其他人的会话,我必须知道他们的用户 ID、用户名和密码哈希,并且能够克服会话的固有加密。

会话 + 数据库选项。这只是存储了一个会话 ID,它引用了数据库中的一行。要更改我想要的会话,我所要做的就是破坏会话的加密并说在会话 ID 中添加一个。然后,我将被验证为在我之后登录的用户。

如果您有很多额外信息,您可以将登录详细信息存储在会话中,然后将任何与登录无关的数据存储在会话表中,但是您也可以不再需要额外的表并从中提取数据您需要的任何相关表格。

【讨论】:

【参考方案5】:

根据我的简短经验,您应该在$_SESSION 中仅存储您不需要在不同设备上由唯一用户打开的所有会话中刷新的数据 . (移动/桌面/等)

换句话说,您确定不会像用户 ID 一样更改的数据

例如,我将用户个人资料图片路径存储到 $_SESSION 它导致了一种奇怪的用户体验。当改变 个人资料图片在桌面,它没有刷新个人资料图片 对于他的手机上的用户。不过,其他用户看到了新图片。 实际上,路径已刷新到 DB 中,但未在 $_SESSION 中。 登出和登入不会改变任何东西。

记住默认行为是$_SESSION 与 cookie 一起传递对于每个浏览器都会有所不同,即使这是同一用户登录。您必须执行 session_destroy() 以避免被旧数据卡住。

我猜也可以将非常临时的数据存储在$_SESSION 中。

注意:在这些参数中,全局会话的基本需求是拥有全局可用的变量

【讨论】:

以上是关于将用户会话变量存储在文件与数据库中的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话与 Cookies [重复]

Grails:在用户会话期间存储数据的最佳方法[关闭]

Django 会话与浏览器本地存储

在会话存储中保存用户对象

在会话中存储用户数据 - 从数据库

将数据库连接存储在会话变量中[重复]