在$_SESSION中保存大量信息是否可行?

9

我需要将许多数组存储在$_SESSION中,以避免从MySQL检索信息。这样做可以吗?在$_SESSION中存储多少信息才算“太多”,或者根本不存在“太多”的限制?谢谢。

P.S. 或者使用http://php.net/manual/en/book.memcache.php更好吗?


你说的“many”数组是指多少?1、10、100、1k还是100k? - Shoe
@Charliepiga:我猜最多100。 - good_evening
5个回答

4
会话中存储的数据量受会话存储层的限制。默认的会话存储是文件系统,一个会话存储在一个文件中。会话变量/数组键的名称以及其数据以序列化形式存储。管道符号将变量名和值彼此分隔。
如果您正在存储包含字符串的数组,则文件的大小将与字符串长度加上键的长度以及一些元数据开销和变量名称大小相关。文件大小受文件系统的限制。例如,在EXT3中,每个文件的大小为16 GB。因此,您无法将更多数据存储到会话中,超过了存储层允许的范围。
我能想到的下一个限制是内存限制。由于PHP需要将数据从文件加载到内存中,并在请求结束时将其从内存存储到文件中。因此,如果您在PHP中设置了内存限制,那么这也将限制您的会话大小。例如,PHP 5.2中有标准的16MB内存限制,但这可能会因安装而异。
顺便说一句,仅使用整个内存来存储会话并没有太多意义。除了这些硬性限制外,还可能存在与并发请求数量、硬盘速度等相关的性能限制。
由于您的问题非常简短,我认为这超出了范围。例如,如果您不需要真正使用memcached,则会产生额外开销。同样,讨论设计决策(永远不要在会话中缓存)是无法一般性回答的。
每个会话100或200千字节(定位到系统上的会话目录,并查看文件变得多大)不应该破坏您的程序。建议您注意,在一定时间后自动删除不再需要的旧会话文件。
有关PHP中会话配置的更多信息,请参见PHP手册中的会话运行时配置

3
很大程度上取决于您期望的用户数量和使用的硬件类型。假设您的PHP配置使用文件存储会话信息(默认设置),并且您有足够的tmp空间,可以在会话中存储相当大的数据块。
个人经验是,在会话中存储了十几个数据对象(通常是与用户相关的数据库结果)。该网站位于公司Intranet上,每小时提供约一万个请求。速度很快,负载很低。如果我猜测每个会话接近100KB。
我不建议在会话中存储超过一两兆字节的数据。您还需要确保PHP和Apache(IIS等)也在清理自己。如果存储了大量会话数据,则临时空间将很快填满。
如果您真的想使这样的东西运行得非常快,并且有现金,那就选择SSD硬盘驱动器。那将使检索速度更快。
希望对您有所帮助。

2
只是要小心SSD,Jeff Atwood(@CodingHorror)在他的博客文章中提到了SSD的故障率... http://www.codinghorror.com/blog/2011/05/the-hot-crazy-solid-state-drive-scale.html - Dave Rix
同意。它们只有有限的写入周期。我不建议将SSD用作设备的主要驱动器(除非该设备是可替换的),并始终保留任何您无法忍受丢失的存储在驱动器上的内容的备份(当然,这是一个好习惯)。 - Chad


1

$_SESSION 不适用于缓存。

如果您需要缓存内容,请使用 APCMemcached 或者 Redis


Memcache模块还提供了一个会话处理程序(memcache)- PHP手册。只是说一下... - Shoe
5
这个回答没有解释“为什么”,而这正是问题所问的。 - Lightness Races in Orbit
1
因为你应该缓存那些必须对多个用户可用的东西。会话(Sessions)无法提供这种功能。如果你需要为每个单独的用户存储100+个数组,那么问题就在于应用程序的设计,“将东西保存在 $_SESSION 中”只是一种廉价且不可持续的 hack。 - tereško
2
我不知道为什么这个完全与主题无关的答案会得到这么多分。他问的是存储数据,而memcache和session都可以做到这一点。真正的答案是:哪一个?你只是回复了一个显而易见的陈述。 - Shoe
2
@teresko 这里可能存在有关缓存定义的差异。如果您在会话中存储100多个数组,那么与在每个页面加载时从数据库检索这100多个数组相比,它并不算太多(否则您必须这样做)。 APC、memcached等是否提供了更优越的机制来将此信息本地存储到用户端?@Charliepiga似乎说memcached有这样的模块。 - Explosion Pills
@tandu,“memcache/memcached sessions”的使用情况有些不同。它适用于那些实际上拥有服务器集群的网站,用户可能会进入其中任何一个服务器。因此,您需要一个分布式系统来保存会话信息。至于“hack”评论:如果您真的为每个用户使用了100多个“唯一”数组,那么您的做法是错误的。如果有5个唯一的数组和95个共享的数组,那么这95个数组应该被缓存,而其余的则保留在会话中(但这可能是没有意义的,因为唯一数据会发生变化)。 - tereško

1

您的会话中的数据量将影响性能。如果您打算使用文件进行会话,请注意 PHP 可能会在磁盘上遇到瓶颈。读取、写入和序列化这些数据可能会产生大量的磁盘 I/O,这是不好的。

就硬上限而言,我怀疑这些限制与您的文件系统相同。例如,如果您将大量数据保存到会话中,并且填满了磁盘,则无法编写其他会话。

使用 memcached 将缓解磁盘 I/O 性能问题,因为从 memcached 中读取和写入要快得多。根据 memcached 规范,您的限制为每个会话 1MB。您的会话总空间将是您启动的 memcache 实例的大小(由启动 memcache 实例时的 -m 标志指定)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接