我有下面的代码来输出一个大文件,但它正在倒下,因为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缓冲区,但我显然是错的。
答案 0 :(得分:4)
如果您只需要输出文件的内容,那么正确的工具就是PHP函数readfile()
。替换您发布的所有代码:
readfile($tarfile);
正如documentation所说:
注意:强>
即使在发送大文件时,
readfile()
也不会出现任何内存问题。如果遇到内存不足错误,请确保使用ob_get_level()
关闭输出缓冲。
答案 1 :(得分:0)
您可以尝试首先加载您需要的数据,如果您加载更多数据,请使用以下函数:fseek()