【问题标题】:Echo script progress and download CSVEcho 脚本进度和下载 CSV
【发布时间】:2015-12-12 04:04:43
【问题描述】:

我在将数组发送到另一个 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 的 php 文件的数组 ($masterArray)

最初我们在 index.php 中使用了 include('create_CSV_file.php') ,但由于 CSV 文件中使用的标头,它给了我们消息那个

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

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

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

我不断收到带有上述回声的错误消息:

注意:数组到字符串的转换

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

【问题讨论】:

  • 请勿将serialize() 用于此目的。使用http_build_query()
  • 看来你最好把数组塞进会话中,因为它已经在服务器端了,没有理由把它推过页面
  • 我不会将数据保存为会话变量,我会将数据存储为服务器端文件。这样您就可以验证数据完整性和操作是否完成。

标签: php arrays csv flush


【解决方案1】:

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

我敢肯定你以前听过这个,但如果没有……你不应该从网络服务器上运行一个需要超过几秒钟(最多!)的进程。他们没有针对它进行优化。您绝对不希望将兆字节的数据传递给客户端,以便他们可以将其发送回服务器!

这样的事情怎么样...

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

好处:

  • 没有长时间运行的 http 请求
  • 在中间阶段没有数据被来回传递给客户端
  • 更好地控制用户查看进度的方式
  • 根据您正在应用的转换/存储在数据库中的详细信息,您可能能够恢复中断的作业(服务器故障)

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

【讨论】:

  • 谢谢基本。你给了我一些思考的东西。我们正在使用 XAMPP 运行这台机器,所以它已经是独立的,它基本上只是用于运行这个脚本。整个过程都是PHP。
  • 没问题。不要误会我的意思,没有理由进行转换的过程不应该是 PHP,只要你喜欢就可以。只是它不应该被网络服务器调用来服务请求。在处理期间保持连接打开会导致网络服务器出现问题(句柄/资源用完,无法释放内存等),还可能需要您设置过分的超时值(使您容易受到 DoS 攻击) .对于一些较旧的代理来说,它很脆弱( 现在不太常见,但仍然非零)。此外,这不是一个好的用户体验
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多