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

art*_*bot 7 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);
Run Code Online (Sandbox Code Playgroud)

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

axi*_*iac 4

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

readfile($tarfile);
Run Code Online (Sandbox Code Playgroud)

正如文档所说:

笔记:

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