【问题标题】:What can be the maximum size for the $_SESSION?$_SESSION 的最大大小是多少?
【发布时间】:2011-03-13 06:53:18
【问题描述】:

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

在会话中保留这么多记录是一种好习惯吗?或者有没有其他方法可以做到这一点?

谢谢。

【问题讨论】:

标签: php csv session-variables


【解决方案1】:

如果您必须分阶段执行此任务(这里有一些建议可以改进您一次完成的工作方式),请不要将 csv 文件保存在 $_SESSION 中...这是毫无意义的开销,因为无论如何你已经在磁盘上拥有了 csv 文件,而且它只是在写入会话数据时给进程增加了很多序列化/反序列化开销。

您一次处理一条 CSV 记录,因此请记下您在 $_SESSION 中成功处理了多少条记录。如果脚本超时或出现错误,则重新启动并读取您已经处理了多少,以便您知道要在文件中的哪个位置重新启动。

【讨论】:

    【解决方案2】:

    $_SESSION 的最大大小是多少?

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

    在会话中保留这么多记录是一种好习惯

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

    或者有没有其他方法可以做到这一点?

    这取决于您要达到的目标。大多数数据库可以直接导入 CSV 文件,也可以附带工具,比 PHP 代码更快、更有效。

    C.

    【讨论】:

      【解决方案3】:

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

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

      1. 将 CSV 文件保存在某处
      2. 开始交易
      3. 运行插入
      4. 在所有插入完成后提交
      5. 交易结束

      链接:MySQL Transaction Syntax

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

      【讨论】:

      • 我无法控制查询,因为我使用的是 Elgg 框架。但这是解决此类问题的真正好方法。谢谢
      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

        如果您使用的是 Postgresql,您可以使用单个查询使用 pg_copy_from 将它们全部插入,或者您可以使用 pg_put_line,如 in the example 所示(从标准输入复制),我发现它在导入大量数据时非常有用数据。

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2013-02-26
            • 2012-06-30
            • 1970-01-01
            • 2012-11-10
            • 2011-02-28
            • 1970-01-01
            • 2013-01-09
            相关资源
            最近更新 更多