$ _SESSION的最大大小是多少?

时间:2010-07-08 11:05:42

标签: php csv session-variables

我正在导入一个包含超过5,000条记录的csv文件。我目前正在做的是,将所有文件内容作为一个数组并逐个保存到数据库中。但是在脚本失败的情况下,整个过程将再次运行,如果我再次开始逐个检查它们,它会使用大量查询,所以我想暂时将导入的值保存在会话中。

在会话中保留那么多记录是一种好习惯吗?或者还有其他方法吗?

谢谢。

6 个答案:

答案 0 :(得分:5)

如果你必须分阶段完成这项任务(这里有一些建议可以改进你在一次通过中做事的方式),不要在$ _SESSION中保存csv文件......这是毫无意义的开销,因为你已经在磁盘上安装了csv文件,并且只是在编写会话数据时为进程添加了大量的序列化/反序列化开销。

您正在逐个处理CSV记录,因此请计算您在$ _SESSION中成功处理的数量。如果脚本超时或barfs,则重新启动并读取已处理的数量,以便知道文件在何处重新启动。

答案 1 :(得分:2)

  

$ _SESSION的最大大小是什么?

会话在运行时加载到内存中 - 所以它受php.ini中的memory_limit限制

  

在会话中保留那么多记录是不错的做法

不 - 由于您描述的原因 - 它也会对性能产生重大影响。

  

或者还有其他方法吗?

这取决于你想要实现的目标。大多数数据库可以直接导入CSV文件,也可以使用比PHP代码更快,更有效的工具。

下进行。

答案 2 :(得分:1)

这不是一个好主意,因为会话数据将针对每个页面请求进行序列化/反序列化,即使它们与您正在执行的操作无关。

我建议使用以下解决方案:

  1. 将CSV文件放在某处
  2. 开始交易
  3. 运行插入
  4. 完成所有插入后
  5. 提交
  6. 交易结束
  7. 链接:MySQL Transaction Syntax

    如果出现故障,插件将被回滚,因此您知道可以安全地重做插入,而不必担心重复数据。

答案 3 :(得分:1)

回答实际问题(有人刚问了一个副本,但删除了它有利于这个问题)

默认会话数据处理程序将其数据存储在临时文件中。从理论上讲,这些文件可以与文件系统允许的一样大。

但是,正如@symcbean指出的那样,会话初始化时会话数据会自动加载到脚本的内存中。这会严重限制您应在会话数据中存储的最大大小。此外,加载大量数据会对性能产生巨大影响。

如果您需要存储大量数据连接到会话,我建议使用您按当前会话ID命名的临时文件。然后,您可以根据需要处理这些文件,并尽可能在脚本的memory_limit范围内处理。

答案 4 :(得分:0)

如果您正在使用Postgresql,您可以使用单个查询使用pg_copy_from来插入它们,或者您可以使用pg_put_line,如显示in the example(从stdin复制),我发现在导入时非常有用大量的数据。

如果您使用MySql,则必须进行多次插入。请记住使用事务,这样如果您使用事务,如果您的查询失败,它将被取消,您可以重新开始。请注意,5000行不是那么大!但是你应该知道max_execution_time约束,它会在几秒钟后终止你的脚本。

对于SESSION而言,我相信你受到脚本可以使用的最大内存量的限制(php.ini中的memory_limit)。会话数据保存在文件中,因此如果连接了许多客户端,还应考虑磁盘空间使用情况。

答案 5 :(得分:0)

这取决于操作系统文件大小,无论会话大小如何,每页默认值为128 MB。