is_executable()
Функция is_executable() в PHP проверяет, существует ли файл и является ли он исполняемым. Возвращает true или false.
Что такое функция is_executable()?
is_executable() — это встроенная функция PHP, которая определяет, существует ли файл и может ли он быть запущен как программа текущим процессом. Она возвращает true только при выполнении обоих условий; в противном случае возвращает false.
«Исполняемый» здесь означает, что операционная система разрешает запуск файла — например, shell-скрипт, скомпилированный бинарный файл или .exe в Windows. Обычный текстовый файл или исходный файл .php как правило не является исполняемым, даже если PHP может его прочитать.
На этой странице рассматриваются синтаксис, что действительно означает возвращаемое значение, как проверка различается в разных операционных системах, а также подводные камни (кэширование, отсутствующие файлы, биты разрешений), с которыми сталкиваются разработчики.
Синтаксис
is_executable(string $filename): bool| Параметр | Описание |
|---|---|
$filename | Путь к файлу для проверки. Может быть относительным к рабочему каталогу скрипта или абсолютным. |
Возвращаемое значение — true, если файл существует и является исполняемым, false в противном случае. PHP также генерирует E_WARNING, если путь недействителен (например, если один из каталогов в пути недоступен для обхода).
Базовый пример
Функция возвращает логическое значение, поэтому её можно напрямую использовать в условии if. Здесь мы указываем на бинарный файл PHP; на типичном Linux-сервере этот путь является исполняемым и выполняется первая ветка. Точный путь зависит от системы, поэтому в следующем примере мы создаём файл, которым полностью управляем.
Создание и тестирование файла
Проверка наиболее информативна, когда вы управляете битами разрешений файла. Пример ниже записывает небольшой shell-скрипт, помечает его как исполняемый с помощью chmod() и подтверждает результат:
<?php
$script = sys_get_temp_dir() . '/hello.sh';
file_put_contents($script, "#!/bin/sh\necho hi\n");
// Before chmod: readable but not executable.
var_dump(is_executable($script)); // bool(false)
chmod($script, 0755); // owner rwx, group/other r-x
clearstatcache(); // forget the cached result
var_dump(is_executable($script)); // bool(true)
unlink($script);Обратите внимание на два момента:
- Файл не является исполняемым, пока не установлен бит разрешения на выполнение, даже если он уже существует и доступен для чтения.
- После изменения разрешений следует вызвать
clearstatcache()(см. ниже).
Смотрите chmod(), чтобы узнать, как восьмеричный режим 0755 соотносится с разрешениями владельца/группы/остальных.
Подводный камень с кэшем stat
PHP кэширует результаты вызовов stat файловой системы (используемых функциями is_executable(), is_readable(), is_writable(), file_exists() и другими) для повышения производительности. Если вы изменяете разрешения файла в рамках одного запроса и затем повторно проверяете его, вы можете получить устаревший ответ:
<?php
$file = sys_get_temp_dir() . '/cache-demo';
touch($file);
is_executable($file); // result is now cached for this path
chmod($file, 0755);
var_dump(is_executable($file)); // may still report the OLD value
clearstatcache();
var_dump(is_executable($file)); // bool(true) — fresh check
unlink($file);Вызывайте clearstatcache() после любых chmod(), chown(), rename() или unlink(), если планируете повторно проверять тот же путь в рамках одного запуска.
Поведение в разных операционных системах
- Linux / macOS — результат определяется битом выполнения Unix (
x) для соответствующего класса пользователя/группы/остальных. Файл с режимом0644не является исполняемым;0755— является. - Windows — биты разрешений на выполнение отсутствуют. PHP определяет «исполняемость» по расширению файла: пути, оканчивающиеся на
.exe,.bat,.cmdили.com, считаются исполняемыми. До PHP 7.4 функцияis_executable()всегда возвращалаfalseв Windows, поэтому проверяйте на целевой версии.
Из-за этих различий никогда не следует предполагать, что скрипт, возвращающий true в Linux, даст тот же результат в Windows, и наоборот.
Когда это использовать?
- Перед запуском внешней программы с помощью
exec(),shell_exec()илиproc_open()— убедитесь, что бинарный файл действительно запускаемый, и выдайте понятную ошибку если нет, вместо того чтобы получить сбой глубоко внутри вызова. - Развёртывание / проверка работоспособности — подтверждение того, что вспомогательный скрипт (cron-задача, хук сборки) имеет правильные разрешения после копирования или извлечения из системы контроля версий, где бит выполнения иногда теряется.
- Защитное ограничение — в сочетании с фиксированным путём отказывайтесь запускать всё, что не является известным, правильно настроенным исполняемым файлом.
Связанные функции
is_executable() принадлежит к семейству проверок разрешений и типов — выбирайте ту, которая соответствует вашему вопросу:
- is_file() — является ли путь обычным файлом (не каталогом)?
- is_dir() — является ли путь каталогом?
- is_readable() — можно ли прочитать файл?
- is_writable() — можно ли записать в файл?
- file_exists() — существует ли путь (файл или каталог)?
- fileperms() — чтение сырых битов разрешений.
- chmod() — изменение битов разрешений файла.
Заключение
is_executable() возвращает true только тогда, когда файл существует и имеет разрешение на выполнение для текущего процесса. Помните три вещи: результат зависит от ОС (бит выполнения Unix vs. расширение файла в Windows), он кэшируется через stat, поэтому вызывайте clearstatcache() после изменения разрешений, и функция наиболее полезна как защита перед запуском внешних программ.