$_SESSION的最大大小是多少?

4
我正在导入一个包含超过5,000条记录的csv文件。目前我正在做的是将所有文件内容作为数组获取并逐一保存到数据库中。但是如果脚本失败,整个过程将再次运行,如果我从数据库中逐一开始检查它们,这将使用大量查询,因此我想将导入的值暂时保存在会话中。
在会话中保留那么多记录是好的实践吗?还是有其他方法可以做到这一点?
谢谢。

请参考以下链接:https://dev59.com/30rSa4cB1Zd3GeqPV2Ar - Haim Evgi
1
@haim evgi:不适用,因为您的链接涉及ASP.NET会话,而此问题是关于PHP会话的。 - user253984
抱歉,我有些困惑,因为我看到了Ismael的回答,他谈到了PHP。 - Haim Evgi
1
LOAD DATA INFILE(http://dev.mysql.com/doc/refman/5.5/en/load-data.html#id2269472)怎么样? - Kuchen
6个回答

5
如果您必须分阶段完成此任务(这里有一些建议可改进单次操作的方式),请不要将CSV文件保存在$_SESSION中...这是无意义的开销,因为您已经在磁盘上有了CSV文件,而且它只会在写入会话数据时增加大量序列化/反序列化开销。
您正在逐个处理CSV记录,因此在$_SESSION中保留成功处理的计数。如果脚本超时或出现故障,则重新启动并读取已处理的数量,以便知道在文件中从哪里重新开始。

3
$_SESSION 的最大大小是多少?
会话在运行时加载到内存中,因此受 php.ini 中 memory_limit 的限制。
将那么多记录保留在会话中是否是一个好的实践?
不是,由于您描述的原因,它还会对性能产生很大影响。
还有其他方法吗?
这取决于你想要实现什么。大多数数据库可以直接导入 CSV 文件,或者带有比 PHP 代码更快且更有效的工具。
C.

1

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

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

  1. 在某个位置保留CSV文件
  2. 开始事务
  3. 运行插入
  4. 在所有插入完成后提交
  5. 结束事务

链接: MySQL Transaction Syntax

如果发生错误,插入将被回滚,因此您知道可以安全地重新插入而不必担心重复数据。


我无法控制查询,因为我正在使用Elgg框架。但这是解决此类问题的真正好方法。谢谢。 - Chetan Sharma

1

回答实际问题(有人刚刚问了一个重复的问题,但删除了它以支持这个问题)

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

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

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


0

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


0
如果使用Postgresql,您可以使用pg_copy_from的单个查询将它们全部插入,或者像示例中所示使用pg_put_line(从stdin复制),我在导入大量数据时发现它非常有用。
如果使用MySql,则必须进行多次插入。记得使用事务,这样如果查询失败,它将被取消,您可以重新开始。请注意,5000行并不算太大!但是您应该了解max_execution_time限制,它会在一定时间后终止脚本。
就SESSION而言,我认为您受到脚本可以使用的最大内存量(php.ini中的memory_limit)的限制。会话数据保存在文件中,因此如果有许多客户端连接,您还应考虑磁盘空间使用情况。

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