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(resource $handle): int — закрывает указатель на процесс, открытый popen(). Возвращает код завершения процесса.
$process = popen("ls -la", "r");
// работа с процессом
$exitCode = pclose($process);Класс SplFileObject автоматически закрывает файл в деструкторе. Явное закрытие выполняется через удаление объекта.
$fileObj = new SplFileObject("data.txt", "r");
// чтение данных
unset($fileObj); // файл закрывается автоматическиАналоги в других языках программирования
Метод close() у файлового объекта. Рекомендуется использовать контекстный менеджер with.
# Явное закрытие
f = open("file.txt", "r")
content = f.read()
f.close()
# Автоматическое закрытие через with
with open("file.txt", "r") as f:
content = f.read()
# Файл закрывается автоматическиМетод 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;
});
});Оператор 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().
$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); // Закрытие сетевого соединения
}Гарантированное освобождение ресурса даже при возникновении исключения.
$file = fopen("important.dat", "w");
try {
if (!$file) throw new Exception("Не удалось открыть файл");
// Код, который может вызвать исключение
fwrite($file, "Критические данные");
} finally {
if (is_resource($file)) {
fclose($file);
}
}$temp = tmpfile(); // Создает временный файл
fwrite($temp, "Временные данные");
// Файл автоматически удалится при закрытии
fclose($temp); // Удаление происходит здесь$handles = [];
for ($i = 0; $i < 5; $i++) {
$handles[] = fopen("log_$i.txt", "a");
}
// Работа с файлами
foreach ($handles as $handle) {
if (is_resource($handle)) {
fclose($handle);
}
}$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);