Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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 存储大量会话数据的最佳位置_Php_Session - Fatal编程技术网

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

Php 存储大量会话数据的最佳位置,php,session,Php,Session,我正在构建一个应用程序,它需要在每个会话中存储和重用大量数据 例如,用户选择一个大的列表项列表(比如2000个或更多),其中有一个数字值作为其键,然后他们保存该选择并转到另一个页面,执行其他操作,然后返回到原始页面,并需要将其选择加载到该页面中 存储和重用这些数据的最快、最有效的方法是什么 在使用会话id保存的文本文件中 在临时数据库表中 在会话数据本身(DB会话,因此大小不受限制)中,使用序列化字符串或gzcompress或gzencode?任意选择。但无论您选择什么,数组都将序列化为字符串,

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

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

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

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

在临时数据库表中


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

任意选择。但无论您选择什么,数组都将序列化为字符串,并保存在文件(隐式地使用会话)或数据库字段中。文件的读写速度更快,搜索也更快。我认为没有理由为此使用数据库


对于替代序列化,请查看此工具:

数据库可以很好地进行此操作。只需将会话链接到visitor表,并创建一个名为visitor\u list\u items的表,该表将所选项目存储为行

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


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

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

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

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

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

为此使用压缩并不能真正提高性能

当然,有很多操作系统级别的调整来优化这一点,但你没有说你的操作系统是什么。假设它的POSIX和您的系统还没有崩溃,那么您的perormance命中率将是:

访问数据文件的延迟 以及解析数据

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

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


C.

您的平台上有SQLite吗?我想说,在数据库中,或者在会话数据库中,或者直接进入您自己的自定义数据结构中,这可能会更快。SQLite可以使用是的,这是一个非常好的主意,您知道!选择过程已经分为两个阶段,我需要大致相同数量的物品!