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

时间:2011-05-25 09:26:27

标签: php database session session-management

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

我正在寻找一篇可靠/研究得很好的文章,该文章更多地讨论了这个问题。我还没能找到任何东西。

5 个答案:

答案 0 :(得分:6)

将数据存储在数据库中的优势在于,只要您希望数据存在,数据就会存在。

您的浏览器会根据其设置方式销毁会话,这会使其有点不可靠。然而,我无法找到关于此的文章,但这是我用作这种情况的惯例。

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

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

对我来说,将用户详细信息存储在数据库中会更安全,因为它不能像$ _SESSION那样以公共方式访问。

如果你愿意,请不要同意我的意见。

答案 1 :(得分:5)

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

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

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

  3. 对于在多个服务器上运行的应用程序,您可以存储 所有会话数据都在一个数据库中。
  4. This文章可能会有所帮助。

答案 2 :(得分:2)

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

考虑一下:

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

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

如果您有大量额外信息,您可以在会话中存储登录详细信息,然后在会话表中存储任何无登录相关数据,但是您可能只需要删除额外表格并从中提取数据无论你需要什么相关的表格。

答案 3 :(得分:2)

这是一个古老的问题。就我个人所学的个人而言。除非您的网站开始大规模繁荣,您需要开始在系统的各个方面使用多个服务器,例如负载平衡,其中您运行许多镜像系统。或者需要为过度填充的系统稍微提高性能使用数据库相关会话或基于文件的会话的好处实际上没有任何不同。授予它我可能是错的这仅仅是我个人对自己经历的看法。就像你一样,我从来没有真正找到任何文章,帖子,其他真正把它们放到测试中的地狱地狱我甚至都认为我没有发现任何真正让测试站独立的东西。就个人而言,我只需要满足任何需求(或我的客户的愿望)通常我只是坚持原生会话文件为基础。

我听说他们可能会被欺骗,但到目前为止还没有看到这个概念的证据。除了那种潜力,我坚持使用基于文件。除非我使用类似代码点火器的系统,否则会话似乎处理更好的DB驱动而不是。

答案 4 :(得分:0)

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

换句话说,您确定的数据永远不会像用户ID 那样改变。

  

例如,我已将用户个人资料图片路径存储到   $_SESSION这导致了一种奇怪的用户体验。换的时候   在桌面上的个人资料图片,它没有刷新个人资料图片   为他的手机上的用户。其他用户看到了新的图片。   实际上,路径已刷新到DB中,但不在$_SESSION中。   登出和登录不会改变任何内容。

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

我认为非常临时的数据也可能存储在$_SESSION中。

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