W3docs

is_readable()

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

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

В этой главе рассматриваются синтаксис, возвращаемое значение, исполняемый пример, наиболее распространённые подводные камни (кэширование, права доступа, гонки состояний), а также связь is_readable() с другими функциями файловой системы PHP.

Синтаксис

is_readable(string $filename): bool
ЧастьЗначение
$filenameПуть к файлу или директории для проверки. Может быть абсолютным (/var/www/data.txt) или относительным — относительно рабочей директории скрипта.
Возвращаетtrue, если путь существует и доступен для чтения текущим пользователем/процессом, false в противном случае.

is_readable() работает и с директориями: возвращает true, когда директорию можно открыть и получить список её содержимого.

Базовый пример

php— editable, runs on the server

Функция возвращает boolean, поэтому её удобно использовать в условии if: вы выбираете ветку выполнения в зависимости от того, доступен ли файл для чтения, не открывая его.

Самодостаточный исполняемый пример

Пример выше указывает на путь, который может не существовать. Вот версия, которую можно запустить в любом окружении — она создаёт файл, проверяет его, а затем проверяет несуществующий путь:

<?php

// Create a temp file we know is readable.
$file = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($file, 'hello');

var_dump(is_readable($file));            // bool(true)
var_dump(is_readable('/no/such/file'));  // bool(false)

unlink($file); // clean up

Первый вызов возвращает true, потому что файл существует и мы только что создали его со своими правами; второй возвращает false, потому что указанный путь вообще не существует.

Защита операции чтения файла

Типичное применение на практике — защитная проверка перед чтением, чтобы отсутствующий или недоступный файл не вызвал предупреждение:

<?php

$path = 'config.json';

if (!is_readable($path)) {
    // Handle the problem your way: log, default, or throw.
    throw new RuntimeException("Cannot read config file: $path");
}

$config = json_decode(file_get_contents($path), true);

Распространённые подводные камни

  • Результаты кэшируются. PHP кэширует информацию о файле (stat) в рамках одного запроса. Если вы изменяете права доступа к файлу в процессе выполнения скрипта, вызовите clearstatcache() перед повторной проверкой, иначе можете получить устаревший результат.
  • true не является гарантией. Права доступа могут измениться между проверкой и фактическим чтением (так называемая гонка времени проверки и использования, TOCTOU). Для критически важного кода лучше просто выполнить чтение и обработать ошибку, не полагаясь только на is_readable().
  • Возвращает false для несуществующих путей — без предупреждений. Поэтому is_readable() одновременно служит проверкой «файл существует и доступен для чтения». Чтобы проверить только существование без учёта прав доступа, используйте file_exists().
  • Права проверяются для пользователя веб-сервера (часто www-data), а не для вашего пользователя в командной строке, когда скрипт выполняется под веб-сервером.

Связанные функции

  • is_writable() — аналог для проверки прав на запись.
  • is_file() — проверяет, является ли путь обычным файлом (не директорией).
  • file_exists() — проверяет существование, игнорируя права на чтение.
  • fopen() и file_get_contents() — функции, которые обычно защищают с помощью is_readable().

Заключение

is_readable() — это лёгкий способ без побочных эффектов убедиться, что путь существует и доступен для чтения, прежде чем открывать его. Используйте её как защитную проверку для корректной обработки ошибок, помните, что её результаты кэшируются в рамках запроса, а для критически важного кода выполняйте чтение и обрабатывайте ошибки, не доверяясь только этой проверке.

Практика

Практика
Что делает функция is_readable() в PHP?
Что делает функция is_readable() в PHP?
Was this page helpful?