使用php和ajax将大数据导出到csv

时间:2014-06-18 19:42:08

标签: php ajax export-to-csv

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

信息:

  1. 需要从数据库表(地址)中导出700000个地址列表。
  2. 服务器超时或内存不足
  3. 项目我正致力于使用多台服务器
  4. 我的解决方案(我尝试了什么)

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

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

    例如:

    我有3台服务器:Server1Server2Server3

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

    所以我的问题是:

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

    更新

    问题得到解决

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您发布了代码,那将非常有用。我之所以这样说是因为它听起来并不像你一行一行地循环,这样可以节省大量的内存 - 没有大数据保存在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?
  5. 希望这有帮助。

答案 2 :(得分:0)

你可以使用ini_set增加php代码的执行时间(' max_execution_time',数字秒数);