Почему мне нужно закончить, используя функцию fclose($handle)
после записи в файл с помощью php? Разве программа автоматически не делает это, когда она заканчивается?
Да. Но, это хорошая практика, чтобы сделать это самостоятельно. Кроме того, вы оставите файл открытым во время всей остальной части скрипта, чего вы должны избегать. Поэтому, если ваш скрипт не завершит выполнение сразу после того, как вы закончите писать, вы в основном оставляете файл открытым дольше, чем вам нужно.
Существуют также последствия для безопасности для удаления дескрипторов файлов: http://cwe.mitre.org/data/definitions/403.html
Ваша программа может выполнять программу с разными уровнями привилегий, а пропущенный файловый дескриптор может разрешить конфиденциальную информацию пересекать границу между процессами двух разных уровней доверия:
http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914
Увлекательная вещь с ошибками безопасности заключается в том, что при написании начальной функции это может быть совершенно безопасно, но через год или два может стать небезопасным из-за невиновного изменения.
Да, PHP обычно закрывает файл перед выходом. Но вы всегда должны закрывать его вручную:
1- Это хорошая практика программирования
2- PHP может неожиданно выйти (например, неперехваченное исключение). Это может оставить файл с чем-то в очереди для записи или с блокировкой в нем.
В выходном буфере могут быть неписаные данные, которые не записываются до тех пор, пока файл не будет закрыт. Если при окончательной записи возникает ошибка, вы не можете сказать, что результат неполный, что может привести к возникновению всех проблем намного позже.
fclose()
образом вызывая fclose()
и проверяя его возвращаемое значение, у вас есть возможность:
или каким-либо другим способом, который соответствует вашей ситуации.
Это упоминается в разделе комментариев справочной страницы fclose()
.
За исключением случаев, когда программа не заканчивается или занимает много времени, она учитывает максимальные открытые дескрипторы файлов в системе. Но да, PHP допускает лень.
Не только в PHP, на каждом языке мы должны закрыть поток, когда работа будет выполнена. Таким образом мы разрешаем другим использовать этот файл. Если мы не закрываем его, другие программы могут не использовать его, пока программа не закончится полностью (в этом случае страница).
Когда файл открывается, на нем помещается блокировка, что предотвращает использование других процессов. fclose()
удаляет эту блокировку.
$handle
– это не объект, а просто указатель. Таким образом, деструктор не говорит об этом, чтобы разблокировать.