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, когда директорию можно открыть и получить список её содержимого.
Базовый пример
Функция возвращает 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() — это лёгкий способ без побочных эффектов убедиться, что путь существует и доступен для чтения, прежде чем открывать его. Используйте её как защитную проверку для корректной обработки ошибок, помните, что её результаты кэшируются в рамках запроса, а для критически важного кода выполняйте чтение и обрабатывайте ошибки, не доверяясь только этой проверке.