Is executable: примеры (PHP)

Проверка исполняемых файлов в PHP через is_executable
Раздел: Работа с файловой системой
is_executable(string $filename): bool
Функция is_executable в PHP

Функция is_executable() проверяет, является ли указанный файл исполняемым. Она используется для определения прав доступа перед выполнением скрипта или запуском внешней программы.

Аргументы функции

Функция принимает один обязательный аргумент:

  • $filename (string) - Путь к проверяемому файлу.

Возвращаемое значение: bool - TRUE, если файл существует и является исполняемым, FALSE в противном случае.

На Windows система считает файл исполняемым, если его расширение (например, .exe, .bat, .cmd) содержится в переменной окружения PATHEXT.

Простые примеры использования
Проверка существующего исполняемого файла
<?php
$file = '/usr/bin/php';
if (is_executable($file)) {
    echo "Файл исполняемый.";
} else {
    echo "Файл не является исполняемым или не существует.";
}
?>
Файл исполняемый.
Проверка скрипта с правами на выполнение
<?php
$script = 'script.sh';
chmod($script, 0755); // Установка прав на выполнение
var_dump(is_executable($script));
?>
bool(true)
Проверка несуществующего файла
<?php
var_dump(is_executable('/несуществующий/путь/file.exe'));
?>
bool(false)
Похожие функции в PHP

Проверяет, существует ли файл и доступен ли он для чтения. В отличие от is_executable(), не проверяет права на выполнение.

Определяет, доступен ли файл для записи. Эти функции часто используют вместе для комплексной проверки прав доступа.

Проверяет только существование файла или директории, не анализируя права доступа.

Функцию is_executable() применяют, когда нужно убедиться в возможности запуска файла. Для проверки существования достаточно file_exists(), а для чтения или записи - is_readable() и is_writable().

Типичные ошибки
Проверка без учёта существования файла
<?php
// Файл не существует, но функция вернет FALSE
if (is_executable('missing_file.sh')) {
    // Этот код не выполнится
    exec('./missing_file.sh');
}
?>
// Ошибки не будет, но и запуска не произойдет
Путаница с проверкой директорий

Функция может вернуть TRUE для директорий на некоторых системах, если есть право на выполнение (вход в директорию).

<?php
// На Linux директория с правом execute
var_dump(is_executable('/tmp'));
?>
bool(true)
Кэширование stat

Результаты могут кэшироваться. При изменении прав во время выполнения скрипта информация может быть устаревшей.

<?php
clearstatcache(); // Очистка кэша
var_dump(is_executable('script.php'));
?>
Изменения в версиях PHP

В PHP 5.0.0 функция стала возвращать TRUE для директорий, что соответствовало поведению системных вызовов.

Начиная с PHP 5.1.3, функция начала работать с обертками URL (например, ssh2.shell://).

В PHP 7.4.0 добавили предупреждение о неверном пути в системах Windows при использовании протокола file://.

PHP 8.0.0 не принес значительных изменений в работу is_executable(), но усилил строгость типизации аргументов.

Расширенные примеры
Рекурсивный поиск исполняемых файлов
Пример php
<?php
function findExecutables($dir) {
    $executables = [];
    $iterator = new RecursiveDirectoryIterator($dir);
    foreach (new RecursiveIteratorIterator($iterator) as $file) {
        if ($file->isFile() && is_executable($file->getPathname())) {
            $executables[] = $file->getPathname();
        }
    }
    return $executables;
}
print_r(findExecutables('/usr/local/bin'));
?>
Проверка с использованием потоков
Пример php
<?php
$wrapper = 'ssh2.shell://user:pass@example.com:22/usr/bin/whoami';
var_dump(is_executable($wrapper));
?>
Сравнение с функцией fileperms()
Пример php
<?php
$file = 'test.sh';
$perms = fileperms($file);
$isExecByPerms = ($perms & 0o111) ? true : false;
$isExecByFunc = is_executable($file);
printf("fileperms: %b, проверка прав: %s, функция: %s", 
    $perms, 
    $isExecByPerms ? 'да' : 'нет',
    $isExecByFunc ? 'да' : 'нет'
);
?>
Безопасный запуск внешней программы
Пример php
<?php
$externalApp = '/opt/myapp/bin/start';
if (is_executable($externalApp)) {
    $output = shell_exec(escapeshellcmd($externalApp) . ' --version');
    echo $output;
} else {
    error_log("Попытка запуска неисполняемого файла: $externalApp");
}
?>
Аналоги в других языках

Is executable в Python

Используют модуль os с функциями access или stat.

import os
print(os.access('/usr/bin/python', os.X_OK))
# Проверка только прав
print(os.path.isfile('/usr/bin/python') and os.access('/usr/bin/python', os.X_OK))
# Комплексная проверка
True
JavaScript (Node.js)

В Node.js применяют модуль fs для проверки прав.

const fs = require('fs');
fs.access('/usr/bin/node', fs.constants.X_OK, (err) => {
    console.log(err ? 'Не исполняемый' : 'Исполняемый');
});
Исполняемый
Bash/Shell

Используют тест -x.

if [ -x /usr/bin/php ]; then
    echo "Исполняемый"
fi
Исполняемый

Основное отличие PHP-функции в её простом синтаксисе и интеграции с внутренней системой кэширования stat.

PHP is_executable function comments

En
Is executable Tells whether the filename is executable