Проверка файлов в PHP: методы и примеры

Раздел: Управление файлами в 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 'Файл не существует или защищён от записи';
}
Файл удалён успешно
или
Файл не существует или защищён от записи

Проверка существования файла в PHP - comments

En
Check file php (php)