如何使用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