Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-将大型会话数组存储在$\u会话或数据库中?_Php_Session_Session Variables - Fatal编程技术网

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

PHP-将大型会话数组存储在$\u会话或数据库中?,php,session,session-variables,Php,Session,Session Variables,在会话期间,我需要存储一个大数组(当前最大存储空间为几kB,最大存储空间限制为0.25MB) 在您的观点和实践中,最好将其存储在$\u会话中还是存储在数据库中 速度很重要,但处理器/内存使用也很重要,因为它位于共享主机上,我不希望他们因为资源过度使用而关闭站点 您认为有一个大小范围,在这个范围内,可以自信地使用$会话,它会很好地工作吗?(例如,0kb-100kB或您的实践/测试显示的任何内容) 谢谢。0.25MB的会话数如果存储在会话中,将比存储在数据库中使用更少的资源。因此,会话中资源过度使用

在会话期间,我需要存储一个大数组(当前最大存储空间为几kB,最大存储空间限制为0.25MB)

在您的观点和实践中,最好将其存储在$\u会话中还是存储在数据库中

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

您认为有一个大小范围,在这个范围内,可以自信地使用$会话,它会很好地工作吗?(例如,0kb-100kB或您的实践/测试显示的任何内容)


谢谢。

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

这在很大程度上取决于站点和服务器的并发用户数量。由于它是一个共享服务器,如果(并且仅当)您有大量用户,我会使用数据库,但是使用$\u会话会更简单、更快,200kbs也不是很多。另外,不使用DB可以节省您检索数据的大量时间,因为它不必在每次请求时来回访问DB服务器和web服务器。

会话通常在使用默认会话处理程序时存储在文件系统上的会话文件中后加载到内存中。除非显式使用内存存储会话,否则会话不会出现持久内存问题。在我看来,不管怎样,开大型会议是不好的。设计中一定有一些根本性的缺陷。如果希望将数据与用户关联,通常可以通过设计数据库来实现,这样数据就可以通过外键与正确的用户关联。您可以查询该数据的一小部分,而不是将一大块数据加载到内存中并对其进行过滤。会话只对用户身份验证真正有用。RESTful API根本不会使用会话。我可能应该注意到,我对无状态web有偏见。会话在请求之间保持状态。我只接受身份验证作为一个有效的用例,因为浏览器没有提供一个通用且安全的替代方案

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

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

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

如果一致性不重要,可以考虑使用MycCurp,如果可用的话。


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

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