2013-02-19 4 views
2

Должен ли я закрывать дескриптор файла каждый раз, когда я открываю новый файл, хотя я перезаписываю переменную дескриптора файла?Перезаписать дескриптор файла без использования fclose() в результате недостатка?

.: например

$fp = fopen("example.txt", 'w'); 
$fp = fopen("example.html", 'w');// is the file handle to example.txt closed now? 
fclose($fp); 

Я создаю несколько файлов внутри петли, и я думаю о том, если мне нужно, чтобы закрыть ручку для каждого файла внутри цикла или один раз после того, как цикл закончен.

+0

Нет, но $ Ф.П. был переписан – 2013-02-19 20:05:51

+0

Это называется «дескриптор файла», а не «обработчик файлов». – Barmar

+1

Это фактически тот же вопрос, что и http://stackoverflow.com/questions/10928892/can-i-close-a-file-by-unsetting-the-handle – Barmar

ответ

2

Когда память начального дескриптора отпущена, ваша система может очистить указатель и закрыть его. С следующим сценарием:

$fp = fopen("example.txt", 'w'); 
$fp = fopen("example.html", 'w'); 

while (true); 

я получаю следующий выход из inotifywait -m -r .:

MODIFY example.txt 
OPEN example.txt 
MODIFY example.html 
OPEN example.html 
CLOSE_WRITE,CLOSE example.txt 

Это означает, что без явного fclose на example.txt, он неявный закрыт в любом случае с помощью Zend Engine, в так же как и закрытие открытого дескриптора в конце выполнения скрипта (т. е. reference-counting).

Как бы то ни было, я по-прежнему рекомендую вам правильно и явно закрыть любые дескрипторы файлов, особенно учитывая ваш прецедент - проблема памяти при открытии нескольких дескрипторов файлов в цикле должна быть достаточно опасной. Добавьте к этому любые проблемы с длинными сценариями, потенциально захватывающими блокировки файлов, соображения безопасности, лучше всего правильно очистить дескриптор.

Смотрите также: Why do I need fclose after writing to a file in PHP?

0

Перед перезаписью необходимо закрыть файл с помощью дескриптора файла. Не использовать для вызова fclose() после того, как вы переписал его, так как fclose() заботится о содержании обработчика, а не о том, что вы называете его от источника

0

Файловые ручки будут еще открыты, пока вы не вызовете fclose()

Все, что вы делаете, это переписать переменную, потеряв ссылку на предыдущий дескриптор. Если вам все еще нужно их контролировать, назначьте их различным переменным.

И сборщики мусора обычно должны удалять объекты без ссылки из памяти, но это происходит не всегда.