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


Best practices to export CSV in PHP: output buffer vs temporary file

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

场景

我在数据库上执行SELECT,该数据库返回任意数量的行,可能是几行,也可能是多行(一百万行以上),这些行需要放在.csv文件中,第一行是头。

怀疑

我知道用PHP导出CSV文件的两种方法:使用输出缓冲区php://output或创建一个临时文件,将其提供给用户,而不是删除它

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

在有大文件的情况下使用临时文件是唯一好的选择。

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

这取决于具体情况。

当你知道文件不是大得离谱,并且下载时并不经常发生时,请使用输出缓冲区。

当你有一个大的东西,它会被下载很多次(同时),把它写到一个文件中可能会更好地减轻数据库和网站的负载。

我认为答案很明显:直接写入php://output。与echo ..相同;输出将或多或少地直接发送到客户端。它可能会也可能不会得到缓冲一段时间,但除非你激活了显式输出缓冲,或者你的web服务器有一个大得离谱的缓冲区,否则它会直接发送。"发送文件"(可能是通过readfile)会通过相同的输出缓冲区传递数据,但会更加复杂和容易出错。