如何使用PHP输出海量文件而不会耗尽内存

时间:2016-02-23 12:34:14

标签: php

我有下面的代码来输出一个大文件,但它正在倒下,因为PHP的内存使用似乎随着文件的读取而增长和增长:

  <?php
  // various header() calls etc.
  $stream = fopen($tarfile,'r');
  ob_end_flush();
  while (!feof($stream)) {
    $buf = fread($stream, 4096);
    print $buf;
    flush();
    unset($buf);
    $aa_usage = memory_get_usage(TRUE); // ← this keeps going up!
  }
  fclose($stream);

我原以为通过flush和unset的组合,额外的内存使用将限制在4k缓冲区,但我显然是错的。

2 个答案:

答案 0 :(得分:4)

如果您只需要输出文件的内容,那么正确的工具就是PHP函数readfile()。替换您发布的所有代码:

readfile($tarfile);

正如documentation所说:

  

注意:

     即使在发送大文件时,

readfile()也不会出现任何内存问题。如果遇到内存不足错误,请确保使用ob_get_level()关闭输出缓冲。

答案 1 :(得分:0)

您可以尝试首先加载您需要的数据,如果您加载更多数据,请使用以下函数:fseek()