Fclose: примеры (PHP)

Руководство по работе с fclose в PHP
Раздел: Работа с файлами
fclose(resource $stream): bool

Описание функции fclose

Назначение и использование

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

Синтаксис и параметры

Сигнатура функции: fclose(resource $stream): bool.

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

  • $stream (ресурс) — файловый указатель, который должен быть корректным и полученным с помощью функций fopen() или fsockopen().

Возвращаемое значение: функция возвращает true в случае успешного закрытия или false в случае неудачи.

Базовые примеры использования

Закрытие файла после записи
$file = fopen("example.txt", "w");
if ($file) {
    fwrite($file, "Тестовые данные");
    $result = fclose($file);
    var_dump($result);
}
bool(true)
Закрытие файла после чтения
$file = fopen("example.txt", "r");
if ($file) {
    $content = fread($file, filesize("example.txt"));
    $closed = fclose($file);
    echo "Файл закрыт: " . ($closed ? "Да" : "Нет");
}
Файл закрыт: Да
Попытка закрыть несуществующий указатель
$result = @fclose("not_a_resource");
var_dump($result);
bool(false)

Альтернативные функции в PHP

Автоматическое закрытие

Файловые указатели, открытые с помощью fopen(), автоматически закрываются при завершении скрипта. Однако явное использование fclose() рекомендуется для контроля ресурсов.

Функция pclose

pclose(resource $handle): int — закрывает указатель на процесс, открытый popen(). Возвращает код завершения процесса.

$process = popen("ls -la", "r");
// работа с процессом
$exitCode = pclose($process);
Объектно-ориентированный подход

Класс SplFileObject автоматически закрывает файл в деструкторе. Явное закрытие выполняется через удаление объекта.

$fileObj = new SplFileObject("data.txt", "r");
// чтение данных
unset($fileObj); // файл закрывается автоматически

Аналоги в других языках программирования

Python

Метод close() у файлового объекта. Рекомендуется использовать контекстный менеджер with.

# Явное закрытие
f = open("file.txt", "r")
content = f.read()
f.close()

# Автоматическое закрытие через with
with open("file.txt", "r") as f:
    content = f.read()
# Файл закрывается автоматически
JavaScript (Node.js)

Метод fs.close(fd, callback) или fs.closeSync(fd). Также используется fs.readFile, который не требует явного закрытия.

const fs = require('fs');
fs.open('file.txt', 'r', (err, fd) => {
    if (err) throw err;
    // работа с файлом
    fs.close(fd, (err) => {
        if (err) throw err;
    });
});
MySQL

Оператор CLOSE для курсоров в хранимых процедурах.

DECLARE cur CURSOR FOR SELECT * FROM table_name;
OPEN cur;
-- чтение данных
CLOSE cur;

Типичные ошибки и их решение

Повторное закрытие указателя
$file = fopen("test.txt", "w");
fclose($file);
$result = fclose($file); // Второй вызов
var_dump($result);
Warning: fclose(): supplied resource is not a valid stream resource
bool(false)

Решение: проверять состояние указателя перед закрытием.

Закрытие указателя с неправильным типом
$result = fclose(null);
var_dump($result);
Warning: fclose() expects parameter 1 to be resource, null given
bool(false)

Решение: передавать только корректные файловые ресурсы.

Игнорирование ошибок записи перед закрытием
$file = fopen("/readonly/disk.txt", "w");
fwrite($file, "data"); // Может не записаться из-за прав
fclose($file); // Возвращает true, но данные не сохранены

Решение: проверять результат fwrite() и использовать fflush() при необходимости.

Изменения в последних версиях PHP

В PHP 8 функция fclose() не претерпела значительных изменений в поведении. Основные улучшения связаны с системой типов:

  • В PHP 8.0 аргумент функции теперь имеет тип resource, что обеспечивает более строгую проверку типов.
  • При передаче некорректного типа данных генерируется ошибка TypeError, а не предупреждение.
// PHP 8.x
fclose("string"); // TypeError: fclose(): Argument #1 must be of type resource, string given

Расширенные примеры использования

Закрытие сетевых соединений

Функция fclose() может закрывать ресурсы, созданные fsockopen().

Пример php
$socket = @fsockopen("example.com", 80, $errno, $errstr, 30);
if ($socket) {
    fwrite($socket, "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n");
    stream_set_timeout($socket, 5);
    $response = fread($socket, 1024);
    fclose($socket); // Закрытие сетевого соединения
}
Безопасное закрытие в блоке try-finally

Гарантированное освобождение ресурса даже при возникновении исключения.

Пример php
$file = fopen("important.dat", "w");
try {
    if (!$file) throw new Exception("Не удалось открыть файл");
    // Код, который может вызвать исключение
    fwrite($file, "Критические данные");
} finally {
    if (is_resource($file)) {
        fclose($file);
    }
}
Работа с временными файлами
Пример php
$temp = tmpfile(); // Создает временный файл
fwrite($temp, "Временные данные");
// Файл автоматически удалится при закрытии
fclose($temp); // Удаление происходит здесь
Закрытие множественных указателей
Пример php
$handles = [];
for ($i = 0; $i < 5; $i++) {
    $handles[] = fopen("log_$i.txt", "a");
}
// Работа с файлами
foreach ($handles as $handle) {
    if (is_resource($handle)) {
        fclose($handle);
    }
}
Проверка успешности записи перед закрытием
Пример php
$file = fopen("data.bin", "wb");
$data = pack("C*", range(1, 100));
$written = fwrite($file, $data);
if ($written === strlen($data)) {
    echo "Все данные записаны\n";
} else {
    echo "Записано только $written байт\n";
}
fflush($file); // Принудительная запись буфера
$closed = fclose($file);

PHP fclose function comments

En
Fclose Closes an open file pointer