【问题标题】:PHP - to store big session array in $_SESSION or in database?PHP - 将大会话数组存储在 $_SESSION 或数据库中?
【发布时间】:2012-01-05 12:56:35
【问题描述】:

我需要在会话期间存储一个大数组(目前最多几 kB,我将其限制为最大 0.25MB)。

在您的意见和实践中,将其存储在 $_SESSION 还是数据库中更好?

速度很重要,但处理器/内存使用也很重要,因为它位于共享主机上,我不希望他们因资源过度使用而关闭站点。

您会说有一个可以使用 $_SESSION 的大小范围,并且确信它会很好地工作吗? (例如 0kb-100kB 或您的练习/测试显示的任何内容)。

谢谢。

【问题讨论】:

  • 我认为使用数据库肯定会更慢。 250 kb 的数据量不算多

标签: php session session-variables


【解决方案1】:

0.25MB 如果存储在 Session 中,具有合理数量的会话将比在 DB 中使用更少的资源。因此,会话中资源过度使用的可能性较低。

【讨论】:

    【解决方案2】:

    这在很大程度上取决于您网站和服务器的并发用户数量。因为它是一个共享服务器,所以当(且仅当)你有大量用户时,我会使用数据库,但使用 $_SESSION 会更容易、更快,而且 200kbs 并不多。此外,不使用数据库可以为您节省大量检索数据的时间,因为它不必在每次请求时来回访问数据库服务器和 Web 服务器。

    【讨论】:

      【解决方案3】:

      会话的真正性能损失是 PHP 为每个请求重写会话数据。写入磁盘(在大多数情况下会这样做)非常慢。它应该只用于简单的事情,如身份验证和小型数据结构,例如购物车之类的。

      根据数据类型和服务器上可用的软件,您应该将其存储在数据库中,或者您可以使用 NoSQL 解决方案,如 MongoDB、Redis 或 CouchDB。

      由于您首先考虑使用会话,因此我认为数据的一致性不是第一要务。如果数据很重要,您应该使用 MySQL 数据库,因为它遵循 ACID 原则,即使在客户端与当前会话解除关联后也会保留您的数据。

      如果一致性不重要,可以考虑使用 Memcached(如果可用)。

      总结:使用数据库,但不一定是 MySQL(取决于它是什么数据)。

      【讨论】:

        【解决方案4】:

        当您使用默认会话处理程序时,会话通常在存储在文件系统上的会话文件中之后被加载到内存中。除非您明确使用内存来存储会话,否则会话不会出现持久的内存问题。在我看来,无论如何举行大型会议都是不好的。设计中必须存在一些基本缺陷。如果您想将数据与用户相关联,这通常通过设计数据库来实现,这样数据只需通过外键与正确的用户相关联。您可以查询此数据的一小部分,而不是将大量数据加载到内存中并对其进行过滤。会话仅对用户身份验证真正有用。 RESTful API 根本不会使用会话。我可能应该注意到我偏向于无状态网络。会话在请求之间保持状态。我只接受身份验证作为有效用例,因为浏览器不提供通用且安全的替代方案

        【讨论】:

        • 我很好奇设计评论中的缺陷,也许你是对的。我正在做的是允许用户检查数千个元素进行处理,因此这些元素自然会列在多个页面中。我需要一种方法来记住用户在页面移动时检查了哪些元素。你认为这种方法有缺陷吗?如果有,你会怎么做?非常感谢回复。
        • 我倾向于确保每个视图都是可寻址的。如果您需要保存数据,例如选择,您可以在客户端保留该数据(以隐藏输入、Json 的形式或作为地址的一部分),然后在每个请求中将该数据发回。如果您有大量数据并且不能依赖 JavaScript,我认为最好的选择是创建包含用户绑定字段和会话绑定字段的表,并通过它们的 id 来处理这些对象。拥有多个页面并不意味着您需要在每个页面上都有数据。
        • 在平均使用情况下,用户不会重新访问之前的页面,他们更频繁地继续进入下一页。所以基本上你所做的是将部分数据存储在你的数据库中,一旦数据完成,让你的数据库来操作它(如果你甚至需要移动它)。但是您不需要重新加载数据来执行此操作,您的数据库可以为您操作它,而无需查询数据并将其返回给应用程序。我建议的会话标识符只是为了让您可以清理一段时间后用户未回收的废弃会话。
        • 如果他们的会话过期,用户也可以继续他们的选择,您只需要根据他们的用户 ID 而不是他们的会话 ID 为他们收回它。会话 ID 仅用于使数据过期。您可以自己使用超时来执行此操作,但这在某些方面重复了会话超时逻辑,并且您必须手动保存数据,就像在页面之间手动保存会话一样。
        • 我接受了另一个答案,因为它直接回答了我的问题,可能对其他人有用,但也指出您确实指出了我的设计中的缺陷并提供了更好的解决方案。
        猜你喜欢
        • 2012-03-03
        • 2011-07-14
        • 1970-01-01
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        相关资源
        最近更新 更多