2013-11-24 7 views
0

Я использую 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Мб память с таким простым скриптом?

+0

'while (true)' ... Плохая идея в PHP-скрипте (и любом другом языке, если на то пошло), независимо от того, какое оправдание вы найдете для его оправдания. – brezanac

ответ

2

Попробуйте это:

function stream_file($file) 
{ 
    $fp = fopen($file, "r"); 
    while ($buffer = fgets($fp, 1024)) 
    { 
     echo $buffer; 
    } 
    fclose($fp); 
} 
+0

Не помогает :-( – Amit

+0

Попробуйте удалить вызов 'ob_end_flush' ... –

+0

Не помогает. – Amit

0

Замена readfile с функцией stream_file работал для меня. Я также добавил размер файла в свои заголовки.

header('Content-Length: ' . $file->getSize()); 
Смежные вопросы