在PHP中导出CSV的最佳实践:输出缓冲区与临时文件

时间:2015-12-23 14:56:27

标签: php csv

在PHP中导出CSV的最佳做法:输出缓冲区与临时文件

方案

我在一个返回任意行数的数据库上执行SELECT,可能很少或很多(一百万+),这些行需要进入带有第一行标题的.csv文件。

我知道使用PHP导出CSV文件的两种方法:使用输出缓冲区foreach ($families as $family) { $parents = array_map(function ($person) { return $person['firstname']; }, array_filter($family, function ($person) { return !empty($person['primary']); })); $children = array_map(function ($person) { return $person['firstname']; }, array_filter($family, function ($person) { return empty($person['primary']); })); if (count($parents)) { echo 'Family : ' . implode(',', $parents) . '<br />'; } if (count($children)) { echo 'Children : ' . implode(',', $children) . '<br />'; } } 或创建临时文件,将其提供给用户,而不是删除它。

哪种方式更好,知道它可能是一个小文件还是一个非常大的文件?考虑PHP内存限制(在php.ini中),请求超时等等。

3 个答案:

答案 0 :(得分:2)

如果你有大文件,使用临时文件是唯一不错的选择。

  1. 您可以将第二个请求(如果存在文件)直接重定向到您的文件,让Web服务器在不执行php的情况下提供服务。
  2. 如果客户端断开连接,同时通过api下载文件, - 在大多数情况下,他将再次开始下载;
  3. 更多的是,您将获得Web服务器上的访问日志,以检查访问此文件的人数和次数。

答案 1 :(得分:1)

我认为答案很明显:直接写给0x30000000。它与php://output相同;输出将或多或少直接发送给客户端。它可能会或可能不会缓冲一点,但除非您激活显式输出缓冲或您的Web服务器有一个非常大的缓冲区,它将直接发送它。 “发送文件”(可能是通过echo ..)会通过相同的输出缓冲区传递数据,但会更加复杂且容易出错。

答案 2 :(得分:1)

这取决于具体情况。

当您知道文件不是非常大且下载不经常发生时,请使用输出缓冲区。

当你有大量的东西时,会被大量下载(同时),将它写入文件可能会更好地减轻数据库和网站的负担。