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

如何使用PHP输出大量文件而不耗尽内存,php,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);

我有下面的代码来输出一个大文件,但它正在崩溃,因为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);

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

readfile($tarfile);
正如政府所说:

注意:

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


您可以先尝试加载所需的数据,如果加载更多数据,请使用函数:

为什么不直接使用?请尝试
ob_flush()
flush()require_once'filename.php'-这对我在Flysystem中使用
readStream
有很大帮助。希望这条评论能让谷歌在其他人在这种情况下搜索Flysystem时找到这个问题。您的问题中的示例实际上对我几乎起到了作用,将
$tarfile
替换为
readStream
资源。谢谢。有时候你会错过那些显而易见的事情,嗯?!尽管我仍然想了解上面的代码有什么问题。我运行了您的代码,
$aa_usage
的值没有改变。它在PHP7上是
2097152
,在PHP5.3上是
786432
,在PHP5.4、5.5和5.6上是
262144
。我使用了一个43MB的文件来测试bare CLI PHP.hmmm,很有趣,谢谢。我的env是Drupal7,虽然我想我会用ob_end_clean()调用禁用任何缓存。。。神秘!代码就是这样做的——一次加载4KB。(不需要fseek——这是作为读取的一部分自动完成的)只是PHP似乎比我需要的时间长,所以每次读取都会增加内存使用。