2015-01-04 5 views
0

У меня есть цикл PHP, в котором я читаю и обрабатываю содержимое нескольких файлов.PHP fclose не освобождает память

<?php 
foreach($files as $file) 
{ 
    $f = fopen($file, 'r'); 
    $content = fread($f, filesize($file)); 
    import($content); 
    fclose($f); 
} 
?> 

Однако после нескольких итераций цикла, я все еще получаю истощенную ошибку памяти на линии Fread() - мое понимание, что с помощью fclose() позволит высвободить память ресурса, но это не так?

Я прочитал ряд других вопросов по этому вопросу, и все они ссылаются на использование fclose(), которое я уже делал. Я также выгружаю memory_get_usage()/memory_get_peak_usage(), и они просто продолжают подниматься до тех пор, пока не появятся ошибки.

Я не понимаю, как fclose() обрабатывает освобождение памяти?

+2

Что делает 'import ($ content)' do? Возможно, это то, что поглощает память. – Oswald

+0

Да, 'import()' не встроен. Эта функция считывает весь контент из этих файлов, а затем не освобождает его, когда он закончен? 'fclose()', как у вас есть, будет работать правильно. –

+0

Хмм, import() просто вставляет данные в базу данных, но если я не вызываю import(), он доходит до конца цикла foreach. Однако я не понимаю, что содержимое читается с помощью fread() внутри foreach и просто передает его для импорта(), так где я могу освободить память? – MattRogowski

ответ

1
<?php 
foreach($files as $file) 
{ 
    $f = fopen($file, 'r'); 
    $content = fread($f, filesize($file)); 
    import($content); 
    fclose($f); // this close file 
    unset($content); // this free memory allocated to content of file 
} 
?> 
+0

Ах, конечно. Как просто. Благодаря! – MattRogowski