如何使用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缓冲区,但我显然是错误的。


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

readfile($tarfile);

正如文件所述:

注意:

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


你可以尝试只加载你需要的数据,如果你加载更多的数据,使用函数:fseek()

链接地址: http://www.djcxy.com/p/90401.html

上一篇: How to output a massive file with PHP without running out of memory

下一篇: change branch into new master github