Перезаписать дескриптор файла без использования fclose(), что приводит к недостатку?


Нужно ли закрывать дескриптор файла каждый раз, когда я открываю новый файл, хотя я перезаписываю переменную дескриптора файла?

Например:

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

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

Author: mgutt, 2013-02-20

2 answers

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

$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 точно так же, как он закрывал бы открытый дескриптор в конце выполнения скрипта (т.Е. Путем подсчета ссылок ).

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

Смотрите также: Зачем мне нужен fclose после записи в файл на PHP?

 2
Author: cmbuckley, 2017-05-23 11:56:24

Дескрипторы файлов будут по-прежнему открыты до тех пор, пока вы не вызовете fclose()

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

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

 0
Author: vikingmaster, 2013-02-19 20:12:58