fclose()
Функция fclose() в PHP закрывает открытый указатель файла. Незаменима для разработчиков, управляющих файловыми ресурсами сервера.
Введение в функцию PHP fclose()
Функция fclose() закрывает указатель файла, который был ранее открыт с помощью fopen(). Указатель файла (также называемый дескриптором или ресурсом потока) — это значение, которое PHP возвращает при открытии файла; все операции чтения и записи используют его для отслеживания текущей позиции в файле.
Закрытие дескриптора по завершении работы важно по двум причинам:
- Сброс буфера записи. PHP и операционная система не обязательно сразу записывают каждый байт на диск — они временно хранят данные в буфере для повышения производительности.
fclose()принудительно записывает все буферизованные данные, поэтому файл, который вы забыли закрыть, может лишиться последних байтов. - Освобождение системных ресурсов. Каждый открытый файл потребляет файловый дескриптор операционной системы. Долго выполняющийся скрипт (или цикл, который открывает файлы без закрытия) может исчерпать лимит дескрипторов и начать завершаться с ошибкой «Too many open files».
PHP автоматически закрывает все ещё открытые дескрипторы при завершении скрипта, поэтому в коротких скриптах данные редко теряются. Однако дескрипторы всё равно следует закрывать явно — особенно в циклах и долго выполняющихся процессах — чтобы ресурсы освобождались как можно раньше.
Синтаксис
fclose(resource $stream): bool$stream— открытый указатель файла, который нужно закрыть.
Параметры
Функция fclose() принимает один обязательный параметр:
$stream: Указатель файла, который нужно закрыть. Это должен быть действительный, открытый ресурс, возвращённыйfopen(),fsockopen(),popen()или аналогичной функцией. Передача недействительного или уже закрытого ресурса вызываетTypeError(PHP 8+) или предупреждение (PHP 7), а функция возвращаетfalse.
Возвращаемые значения
Возвращает true в случае успеха или false в случае ошибки.
Примеры
Пример 1: Открытие, запись и закрытие файла
Наиболее распространённый шаблон — открыть файл, поработать с ним и закрыть. При закрытии буферизованный текст сбрасывается на диск:
Запись в файл и закрытие дескриптора
<?php
$handle = fopen("notes.txt", "w"); // open for writing (creates/empties the file)
fwrite($handle, "Hello, fclose!\n");
fclose($handle); // flush + release the handle
echo "File written and closed.";Вывод:
File written and closed.Пример 2: Всегда проверяйте, что файл открылся
fopen() возвращает false, если файл не удаётся открыть (файл отсутствует, нет разрешений). Закрытие false является ошибкой, поэтому сначала проверьте дескриптор:
Защита от неудавшегося открытия
<?php
$handle = fopen("data.txt", "r");
if ($handle === false) {
echo "Could not open the file.";
} else {
// ... read from the file ...
fclose($handle);
echo "Done.";
}Пример 3: Закрытие внутри цикла
При обработке множества файлов закрывайте каждый дескриптор сразу после завершения работы с ним, чтобы дескрипторы не накапливались:
Закрытие каждого дескриптора внутри цикла
<?php
$files = ["a.txt", "b.txt", "c.txt"];
foreach ($files as $name) {
$handle = fopen($name, "r");
if ($handle !== false) {
// ... process the file ...
fclose($handle); // closed before the next iteration opens another
}
}Пример 4: Проверка возвращаемого значения
В коде, где важен успех закрытия (например, при записи в сетевой поток), проверяйте возвращаемое значение:
Обработка ошибки закрытия
<?php
$handle = fopen("report.txt", "w");
fwrite($handle, "Generated report\n");
if (fclose($handle) === false) {
echo "Failed to close the file — data may not have been saved.";
} else {
echo "File saved successfully.";
}Типичные ошибки
- Не используйте дескриптор после закрытия. После выполнения
fclose()ресурс становится недействительным; повторный вызовfread(),fwrite()илиfclose()на нём завершится ошибкой. - Один
fclose()на каждыйfopen(). Двойное закрытие одного дескриптора вызывает ошибку при втором вызове. fclose()не удаляет файл. Функция только освобождает указатель. Используйтеunlink()для удаления файла с диска.- Автозакрытие ≠ бесплатный ресурс. Полагаться на автоматическое закрытие PHP в конце скрипта нормально для небольших скриптов, но цикл, открывающий файлы без закрытия, может достичь лимита файловых дескрипторов ОС задолго до завершения скрипта.
Связанные функции
fopen()— открывает файл и возвращает дескриптор, который впоследствии закрываетfclose().fwrite()— записывает данные в открытый дескриптор.fread()/fgets()— читают из открытого дескриптора.feof()— проверяет, достигнут ли конец файла.PHP File Handling— общая картина работы с файлами.
Заключение
fclose() закрывает открытый указатель файла, сбрасывая все буферизованные записи и освобождая системный ресурс. Хотя PHP закрывает дескрипторы автоматически по завершении скрипта, явное закрытие — особенно внутри циклов и в долго выполняющихся скриптах — предотвращает исчерпание файловых дескрипторов и гарантирует запись данных на диск. Пару каждому fopen() составляйте fclose() и защищайтесь от неудавшегося открытия перед чтением, записью или закрытием.