W3docs

fclose()

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

Введение в функцию PHP fclose()

Функция fclose() закрывает указатель файла, который был ранее открыт с помощью fopen(). Указатель файла (также называемый дескриптором или ресурсом потока) — это значение, которое PHP возвращает при открытии файла; все операции чтения и записи используют его для отслеживания текущей позиции в файле.

Закрытие дескриптора по завершении работы важно по двум причинам:

  • Сброс буфера записи. PHP и операционная система не обязательно сразу записывают каждый байт на диск — они временно хранят данные в буфере для повышения производительности. fclose() принудительно записывает все буферизованные данные, поэтому файл, который вы забыли закрыть, может лишиться последних байтов.
  • Освобождение системных ресурсов. Каждый открытый файл потребляет файловый дескриптор операционной системы. Долго выполняющийся скрипт (или цикл, который открывает файлы без закрытия) может исчерпать лимит дескрипторов и начать завершаться с ошибкой «Too many open files».

PHP автоматически закрывает все ещё открытые дескрипторы при завершении скрипта, поэтому в коротких скриптах данные редко теряются. Однако дескрипторы всё равно следует закрывать явно — особенно в циклах и долго выполняющихся процессах — чтобы ресурсы освобождались как можно раньше.

Синтаксис

fclose(resource $stream): bool
  • $stream — открытый указатель файла, который нужно закрыть.

Параметры

Функция fclose() принимает один обязательный параметр:

  1. $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() и защищайтесь от неудавшегося открытия перед чтением, записью или закрытием.

Практика

Практика
Какова цель функции fclose() в PHP?
Какова цель функции fclose() в PHP?
Was this page helpful?