Подтвердить что ты не робот

Зачем мне нужно "fclose" после записи в файл на PHP?

Зачем мне нужно закончить, используя функцию fclose($handle) после записи в файл с помощью php? Не запускается ли программа автоматически, когда она заканчивается?

4b9b3361

Ответ 1

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

Ответ 2

Есть также последствия для безопасности для открытия дескрипторов файлов: http://cwe.mitre.org/data/definitions/403.html

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

http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914

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

Ответ 3

Да, PHP обычно закрывает файл перед выходом. Но вы всегда должны закрывать его вручную:

1- Это хорошая практика программирования

2- PHP может неожиданно выйти (например, неперехваченное исключение). Это может оставить файл с чем-то в очереди для записи или с блокировкой в ​​нем.

Ответ 4

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

Явным образом вызывая fclose() и проверяя его возвращаемое значение, вы можете:

  • Повторите операцию
  • Разверните изменения
  • Возвращает условие сбоя вызывающей функции
  • Сообщить о проблеме пользователю
  • Документировать проблему в файле журнала
  • Возвращает индикацию сбоя в среду выполнения (например, оболочку командной строки), которая может иметь решающее значение при использовании в цепочке инструментов.

или каким-либо другим способом, который соответствует вашей ситуации.

Это упоминается в разделе комментариев страницы fclose().

Ответ 5

За исключением случаев, когда программа не заканчивается или занимает много времени, она учитывает максимальные открытые дескрипторы файлов в системе. Но да, PHP допускает лень.

Ответ 6

Не только в PHP, на каждом языке мы должны закрыть поток, когда работа будет выполнена. Таким образом мы разрешаем другим использовать этот файл. Если мы не закрываем его, другие программы могут не использовать его, пока программа не закончится полностью (в этом случае страница).

Ответ 7

Когда файл открывается, на нем помещается блокировка, что предотвращает использование других процессов. fclose() удаляет эту блокировку.

$handle не является объектом, просто указателем. Таким образом, нет деструктора, говорящего ему, чтобы разблокировать.