【问题标题】:Export large data to csv with php and ajax使用 php 和 ajax 将大数据导出到 csv
【发布时间】:2014-06-18 19:42:08
【问题描述】:

我在使用 php 将大量数据导出到 csv 文件时遇到问题。

信息:

  1. 需要从数据库表(地址)中导出700000个地址列表。
  2. 服务器超时或内存不足
  3. 我正在使用多台服务器的项目

我的解决方案(我尝试了什么)

逐部分获取数据(从数据库中)处理此数据(fputcsv)将此部分写入临时文件 - 并通过Ajax 将信息发送给用户(向他显示已处理的百分比)。处理完最后一部分数据后,只需提供用户链接以下载此文件。一切都很好,我已经这样做了,这个解决方案对我有用 - 在我当地的环境中,但是

问题是 - project I'm working on working with multiple servers 所以我遇到了临时文件可以存储在不同服务器上的问题。

例如:

我有 3 台服务器:Server1Server2Server3

我第一次使用limit 0 50000 从数据库中读取数据 - 处理它并将其保存到Server1 上的File.csv,下一次迭代limit 50000, 50000 可以保存在另一台服务器 Server2 - 这就是问题所在。

所以我的问题是:

我可以在哪里存储我处理过的临时 csv 数据,或者我可能遗漏了什么,我被困在这里,寻求建议。 每个建议或解决方案将不胜感激!谢谢。

更新

问题已解决

稍后我会发布我的解决方案

【问题讨论】:

  • 不清楚多台服务器,你的意思是多台数据库服务器包含数据?
  • @Dagon 不,多个网络服务器
  • 您可以使用/设置一个作业队列系统,其中实际工作由服务器上的后台任务完成,而不是 http 请求?也许beantalkd - lornajane.net/posts/2014/working-with-php-and-beanstalkd
  • @Amine Matmati,我想是的,但我不太了解它到底是什么
  • 我希望这个教程系列对您有所帮助 - kamisama.me/2012/10/09/…

标签: php ajax export-to-csv


【解决方案1】:

您可以使用带有限制的 mysql 查询,到 dircly export the records into csv file from mysql database

SELECT id, name, email INTO OUTFILE '/tmp/result.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY ‘\\’
LINES TERMINATED BY '\n'
FROM users WHERE 1

【讨论】:

    【解决方案2】:

    如果您发布您的代码,这将非常有帮助。我这么说的原因是因为听起来你不是在逐行循环,这会为你节省大量内存 - 没有巨大的数组可以保存在 RAM 中。如果您逐行循环并提交到 CSV 文件,那么我建议您修改代码来做到这一点,它可能会完全解决问题。

    如果确实如此,即使逐行提交 CSV 也是不够的。那么您遇到的问题是您的服务器设置依赖于代码是无状态的,但您的代码不是。

    您可以使用以下任一方式解决此问题:

    1. 使用户会话服务器特定。如果您通过负载均衡器路由请求,那么您可能可以在那里控制该设置。如果没有,您将不得不进入自定义会话变量并相应地配置您的环境。我不喜欢这种方法,但如果您可以通过负载均衡器对其进行控制,这可能是解决问题的最快方法。
    2. 将临时文件保存到所有服务器都可以使用简单事务 ID 或其他标识符访问的共享数据库。让处理导出的最后一部分的服务器聚合数据并准备文件以供下载。
    3. 您可能会遇到另一个内存限制或方法#2 的最大运行时间问题。在这种情况下,如果您无法提高服务器的 RAM,请将 PHP 配置为使用额外的 RAM 并延长脚本的最大运行时间。那么我的建议是让用户逐部分下载文件。将 CSV 文件导出到服务器支持的上限,让用户下载,然后让他们下载下一个文件,依此类推。
    4. 您可能应该先尝试此方法,然后再尝试任何其他方法。但也许我们必须要问的问题是,为什么首先使用 PHP 将数据库条目转换为 CSV?许多数据库都内置了 CSV 导出,几乎可以保证占用更少的内存和时间。例如,如果您使用 MySQL,则可以使用 - How to output MySQL query results in CSV format?

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以使用 ini_set('max_execution_time', seconds in numbers); 增加 php 代码的执行时间;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多