存储大量会话数据的最佳位置

时间:2010-04-29 14:05:10

标签: php session

我正在构建一个需要在每个会话中存储和重用大量数据的应用程序。

因此,例如,用户选择一个大的列表项列表(比如2000或更多),这些列表项具有数值作为键,然后他们保存该选择并转到另一个页面,执行其他操作然后返回到原始页面,需要将他们的选择加载到该页面。

存储和重用这些数据的最快捷,最有效的方法是什么?

在使用会话ID保存的文本文件中?

在临时数据库表中?

在会话数据本身(数据库会话,因此大小不是限制)使用序列化字符串或使用gzcompress或gzencode

3 个答案:

答案 0 :(得分:1)

虽然通常我总是建议用户将数据保存在数据库而不是简单文件中,但这是一个例外。通常,与文件相比,在数据库中存储数据会有轻微的开销 - 但前者提供了很大的访问灵活性,并消除了许多锁定问题。但是,除非您希望您的页面变得特别慢用户在多个浏览器访问同一会话时运行,否则并发性不会是一个大问题,即

使用任何类型的数据库都会更慢

(另外,如果你要处理一大群web服务器 - 超过200个 - 共享同一个会话,那么是的,分布式数据库可能胜过SAN上的集群文件系统)。

您可能想要考虑会话编写的频率。无论是否已更改,默认处理程序都会将数据写回磁盘 - 对于如此大的会话,我建议您使用自己编写的会话处理程序,而不只是将序列化的会话数据写入文件,还存储序列化数据的哈希值 - 当您在会话中读取时,将哈希值存储在静态变量中。在保存处理程序中,生成一个新的哈希并将其与加载时填充的静态变量进行比较 - 只有在会话已更改时才写入会话。您可以通过应用启发式将会话分成经常更新的部分和不经常更改的部分,然后将它们记录在单独的文件中来进一步扩展。

使用压缩实际上并没有对性能有所帮助。

当然,很多操作系统级别调整都可以进行优化,但是您没有说明您的操作系统是什么。假设它的POSIX和你的系统还没有跪下,那么你的性能打击将会是:

访问数据文件的延迟 并解析数据

(读取文件的时间相对较小,写入应该缓冲)。

只要有足够的缓存,就会从内存而不是磁盘读取文件,因此延迟可以忽略不计。

下进行。

答案 1 :(得分:0)

无论如何你想要的。但无论您选择什么,该数组都将被序列化为一个字符串,并保存在一个文件中(隐式地,使用会话)或数据库字段中。读取和写入在文件上执行得更快,搜索也是如此。我认为没有理由为此使用数据库。

有关替代序列化,请查看此工具:http://msgpack.sourceforge.net/

答案 2 :(得分:0)

数据库可以正常工作。只需将会话链接到访问者表,并有一个名为visitor_list_items的表,它将所选项存储为行。

2000并不是一个疯狂的数字。我的意思是,geez,如果他们要坐在那里选择2000个列表项,他们可以等一秒钟来加载页面! (你确定没有办法将这个选择过程分解为几个步骤吗?)

如果它在数据库中,您可以利用传统的数据库使用(即,更容易运行报告访问者在访问您的网站时选择的项目等)。