Проверка файлов в PHP: методы и примеры
Проверка существования файлов в PHP: основные подходы
Наиболее эффективное решение: file_exists() с дополнительной проверкой is_file()
Функция file_exists() проверяет существование файла или директории. Она работает быстро и поддерживается во всех версиях PHP. Однако возвращает true для любого существующего пути, включая каталоги. Для точного определения, что путь ведёт именно к файлу, используется комбинация с is_file().
$path = '/var/www/data.txt';
if (file_exists($path)) {
if (is_file($path)) {
echo 'Файл существует';
} else {
echo 'Путь существует, но это не файл (возможно директория)';
}
} else {
echo 'Файл не найден';
}
Php set file (установка файла в php)
Типичные ошибки
file_exists()кэширует результаты. После создания или удаления файла в том же скрипте может вернуть устаревшие данные. Рекомендуется вызыватьclearstatcache()перед проверкой, если файловая система могла измениться.- Функция не работает с удалёнными файлами (http://, ftp://) – для них нужно использовать cURL или
fopen(). - На некоторых конфигурациях (например, open_basedir)
file_exists()может вести себя непредсказуемо.
Как проверить, что путь является файлом, а не директорией?
is_file() возвращает true только для обычных файлов (не директорий, не ссылок). Если требуется проверка на символическую ссылку, используется is_link().
$target = 'example.txt';
if (is_file($target)) {
echo 'Цель является файлом';
} else {
echo 'Либо файла нет, либо это директория';
}
Php move file (перемещение файла в php)
Ошибки: is_file() также кэширует результаты; не работает с нелокальными файлами. Для проверки существования самой ссылки используйте is_link().
Как убедиться, что файл доступен для чтения?
is_readable() проверяет, существует ли файл и разрешено ли чтение текущим пользователем PHP.
$cfg = 'config.php';
if (is_readable($cfg)) {
$content = file_get_contents($cfg);
} else {
echo 'Файл конфигурации недоступен для чтения';
}
Check file php (проверка существования файла в php)
В Windows функция может некорректно учитывать права доступа. Также is_readable() возвращает false для файлов с установленным битом 0000.
Как проверить возможность записи в файл?
is_writable() аналогична is_readable(), но для записи.
$log = 'app.log';
if (is_writable($log)) {
file_put_contents($log, 'Новая запись', FILE_APPEND);
} else {
echo 'Файл журнала недоступен для записи';
}
Php copy file (копирование файла в php)
Ошибки: проверка может давать ложноположительный результат на некоторых файловых системах (например, NFS). Рекомендуется дополнительно пробовать записать данные.
Как проверить существование файла через fopen?
Метод с fopen() подходит для случаев, когда файл нужно сразу открыть. Не рекомендуется для простой проверки из-за накладных расходов.
$fh = @fopen('data.csv', 'r');
if ($fh) {
echo 'Файл открыт';
fclose($fh);
} else {
echo 'Файл не существует или не открывается';
}
File new php (создание нового файла в php)
Проблемы: создаётся файловый дескриптор, который нужно закрыть. Если файл блокирован другим процессом, fopen() может вернуть false даже при существовании файла.
Как получить статистику файла и заодно проверить его существование?
Функция stat() возвращает массив с информацией о файле или false, если файл не существует.
$info = @stat('module.php');
if ($info === false) {
echo 'Файл не найден';
} else {
echo 'Размер файла: ' . $info['size'] . ' байт';
}
Аналогично другим функциям, stat() использует кэш. Для свежих данных требуется clearstatcache(). Также не работает с удалёнными файлами.
Как избежать проблем с кэшированием результатов?
clearstatcache() очищает внутренний кэш PHP для файловых операций. Вызывается перед проверками, если в текущем запросе могли измениться файлы.
clearstatcache();
if (file_exists('temp.log')) {
// работа с файлом
}
Забывчивость о кэше – частая причина трудноуловимых багов, когда файл уже создан, а file_exists() всё ещё возвращает false.
Пример 1: Проверка файла перед чтением с расширенным логированием
$file = 'input.txt';
clearstatcache();
if (!file_exists($file)) {
error_log("Файл $file не найден", 0);
die('Ошибка: файл не найден');
}
if (!is_readable($file)) {
error_log("Файл $file недоступен для чтения", 0);
die('Ошибка: недостаточно прав для чтения');
}
$data = file_get_contents($file);
echo 'Содержимое файла: ' . htmlspecialchars($data);
// При успехе: Содержимое файла: ... // При ошибке: Ошибка: файл не найден (запись в лог)
Пример 2: Проверка существования удалённого файла через cURL
$url = 'https://example.com/remote.txt';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode == 200) {
echo 'Файл существует на удалённом сервере';
} else {
echo 'Файл не найден (HTTP код ' . $httpCode . ')';
}
Файл существует на удалённом сервере или Файл не найден (HTTP код 404)
Пример 3: Проверка с учётом символических ссылок
$link = '/tmp/link_to_file';
if (is_link($link)) {
$real = readlink($link);
if (file_exists($real)) {
echo 'Ссылка ведёт на существующий файл: ' . $real;
} else {
echo 'Ссылка битая (файл не существует): ' . $real;
}
} else {
echo 'Путь не является символической ссылкой';
}
Ссылка ведёт на существующий файл: /var/data/target.txt или Ссылка битая (файл не существует): /var/data/ghost.txt
Пример 4: Пакетная проверка нескольких файлов с отчётом
$files = ['config.php', 'index.html', 'style.css', 'missing.txt'];
$results = [];
foreach ($files as $f) {
clearstatcache();
$exists = file_exists($f);
$isFile = is_file($f);
$readable = is_readable($f);
$results[] = [
'name' => $f,
'exists' => $exists,
'is_file' => $isFile,
'readable' => $readable
];
}
echo json_encode($results, JSON_PRETTY_PRINT);
[
{
"name": "config.php",
"exists": true,
"is_file": true,
"readable": true
},
...
]
Пример 5: Использование stat() для проверки и получения времени модификации
$file = 'data.db';
$stat = @stat($file);
if ($stat === false) {
echo 'База данных отсутствует';
} else {
$mtime = $stat['mtime'];
echo 'Файл существует. Последняя модификация: ' . date('Y-m-d H:i:s', $mtime);
}
Файл существует. Последняя модификация: 2025-03-15 12:30:45 или База данных отсутствует
Пример 6: Проверка перед удалением файла с подтверждением
$file = 'old.log';
if (file_exists($file) && is_writable($file)) {
if (unlink($file)) {
echo 'Файл удалён успешно';
} else {
echo 'Не удалось удалить файл';
}
} else {
echo 'Файл не существует или защищён от записи';
}
Файл удалён успешно или Файл не существует или защищён от записи