我有下面的代码来输出一个大文件,但它正在倒下,因为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缓冲区,但我显然是错的.
如果您需要的只是输出文件的内容,那么执行此操作的正确工具就是 PHP 函数readfile()。将您发布的所有代码替换为:
readfile($tarfile);
Run Code Online (Sandbox Code Playgroud)
正如文档所说:
笔记:
readfile()即使单独发送大文件,也不会出现任何内存问题。如果遇到内存不足错误,请确保输出缓冲已关闭ob_get_level()。