PHP - 将大会话数组存储在$ _SESSION或数据库中?

问题描述:

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

在您的意见和实践中,将它存储在$ _SESSION或数据库中会更好吗?

速度很重要,但处理器/内存使用情况也如此,因为它在共享主机上,我不希望他们关闭网站以避免资源过度使用。

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

谢谢。

+1

我假设使用数据库肯定会变慢。 250 kb并不是那么多的数据 – knittl 2012-01-05 12:59:18

如果存储在会话中,具有相同会话数量的0.25MB将比在数据库中使用更少的资源。因此,会议资源过度使用的可能性较低。

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

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

+0

我对设计评论中的缺陷非常好奇,也许你是对的。我所做的是让用户检查数千个元素进行处理,因此这些元素自然会列在多个页面中。我需要一种方法来记住用户在浏览页面时检查了哪些元素。你认为这种方法有缺陷吗?如果是这样,你会怎么做?回复非常感谢。 – CodeVirtuoso 2012-01-05 13:19:55

+1

我倾向于确保每个视图都是可寻址的。如果您需要保存数据(如选择),则可以将这些数据保存在客户端(以隐藏输入,Json形式或作为地址的一部分),并在每次请求后发回数据。如果你有很多数据,并且不能依赖JavaScript,我认为最好的选择是创建包含用户绑定字段和会话绑定字段的表,并通过它们的id来访问这些对象。拥有多个页面并不意味着您需要在每个页面上都有数据。 – 2012-01-05 13:38:22

+0

在平均使用情况下,用户不会重新浏览以前的页面,他们更多时候会继续浏览下一页。所以基本上你在做的是将部分数据存储在你的数据库中,一旦数据完成,让你的数据库来操纵它(如果你甚至需要移动它)。但是你不需要重新加载数据来做到这一点,你的数据库可以为你操作而不用查询数据并将其返回给应用程序。我建议的会话标识符就是为了清理用户在一段时间后未收回的放弃的会话。 – 2012-01-05 13:41:01

会话的真实性能损失是PHP重写了每个请求的会话数据。写入磁盘(它将在磁盘上执行)非常缓慢。它只能用于简单的事情,如认证和小数据结构,例如购物车等。

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

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

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

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