回显脚本进度并下载CSV

时间:2015-12-12 04:04:43

标签: php arrays csv flush

我在将数组发送到另一个PHP页面时遇到问题。我们将一个数组从一个页面发送到另一个页面以生成已从XML转换的CSV文件。因此我们采用800mb的XML文件并将其转换为20mb的CSV文件。我们正在删除其中的大量信息,它运行30分钟。

无论如何,我们定期使用一个函数在浏览器中输出转换的进度:

function outputResults($message) {
    ob_start();
    echo $message . "<br>";
    ob_end_flush();
    ob_flush();
}

$ masterArray 包含我们从XML解析的关联数组中的所有信息。

我们从 index.php 发送到另一个名为 create_CSV_file.php $ masterArray ) >

最初我们在 index.php 中使用了 include(&#39; create_CSV_file.php&#39;),但由于CSV文件中使用了标头,因此给了我们消息

  

警告:无法修改标头信息 - 已发送的标头

。所以我们开始研究如下推送阵列的解决方案。

echo "<a href='create_CSV_file.php?data=$masterArray'>**** Download CSV file ***</a>";

我一直收到上面回显的错误信息:

  

注意:数组转换为字符串

能够在服务器运行时显示echo语句的最佳方法是什么,然后能够在结束时下载结果CSV?

1 个答案:

答案 0 :(得分:0)

好的,首先,使用网址(GET)中的数据有一些严重的限制。较旧版本的IE仅支持4096字节的URL。此外,一些代理和其他软件强加了自己的限制。

我确定您之前已经听过这个消息,但如果没有......您不应该从Web服务器运行一个花费超过几秒钟(最多!)的进程。他们没有针对它进行优化。你绝对不希望将兆字节的数据传递给客户端,以便他们可以将其发送回服务器!

这样的事情怎么样......

  • 用户发出网页请求(并上传原始数据?)到服务器
  • 服务器为请求分配ID(随机?数据库?)并使用ID作为名称(tmp目录,或至少在Web根目录外)在磁盘上创建文件。
  • 服务器启动一个新进程(PHP?)来转换数据。在运行时,它可以使用进度信息更新数据库
  • 在此期间,用户可以通过发出一系列AJAX请求(或只刷新显示最新状态的页面)来检查进度。现在更多地控制外观
  • 处理完成后,服务器端进程将结果写入文件,更新数据库以指示完成。
  • 下次用户检查状态时,将其重定向到一个获取ID的PHP文件,并从磁盘读取该文件/将其传输给用户。

优点:

  • 没有长时间运行的http请求
  • 在中间阶段没有数据传递给客户
  • 更多地控制用户如何看待进度
  • 根据您正在应用的转换/存储在数据库中的详细信息,您可以恢复中断的作业(服务器故障)

它有一个缺点,就是你需要自己清理 - 你需要删除你在磁盘上创建的文件,但是,你已经对数据库中的所有文件进行了完整的审计并删除了任何内容。超过x天,这将是微不足道的。