如何使用PHP输出大量文件而不耗尽内存
我有下面的代码来输出一个大文件,但它正在崩溃,因为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
// 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似乎比我需要的时间长,所以每次读取都会增加内存使用。