Я использую PHP-скрипт (аналогичный приведенному ниже) для потока файла.
(стек сервера включает Nginx + PHP-FPM + apc)Допустимая память Исчерпана при чтении файлов
function send_headers($content_type, $filename)
{
@ob_end_clean();
header("Content-Type: ".$content_type);
header("Content-Disposition: attachment; filename=\"".$filename."\"");
@ob_end_flush();
}
function stream_file($file)
{
$fp = fopen($file, "r");
while(true)
{
$buffer = fgets($fp, 1024);
if ($buffer === FALSE)
{
break;
}
echo $buffer;
$buffer = NULL; // unset($buffer) as well gives memory exhaustion error
}
fclose($fp);
}
send_headers('text/plain', 'sample.txt');
stream_file('home/linux/report.txt');
После ошибки после входа часто в журнале Nginx
[error] 18391#0: *13673875 FastCGI sent in stderr: "PHP message: PHP Fatal error:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 64 bytes) in
/home/linux/src/library/file.php on line XX" while reading response header from
upstream, client: XXX.XXX.XXX.XXX, server: example.com, request:
"GET /file/download HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000",
host: "example.com"
Почему PHP бежать из 128Мб память с таким простым скриптом?
'while (true)' ... Плохая идея в PHP-скрипте (и любом другом языке, если на то пошло), независимо от того, какое оправдание вы найдете для его оправдания. – brezanac