Is executable: примеры (PHP)
is_executable(string $filename): boolФункция 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)
Проверяет, существует ли файл и доступен ли он для чтения. В отличие от 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)
Результаты могут кэшироваться. При изменении прав во время выполнения скрипта информация может быть устаревшей.
<?php
clearstatcache(); // Очистка кэша
var_dump(is_executable('script.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
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
$wrapper = 'ssh2.shell://user:pass@example.com:22/usr/bin/whoami';
var_dump(is_executable($wrapper));
?><?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
$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
В Node.js применяют модуль fs для проверки прав.
const fs = require('fs');
fs.access('/usr/bin/node', fs.constants.X_OK, (err) => {
console.log(err ? 'Не исполняемый' : 'Исполняемый');
});Исполняемый
Используют тест -x.
if [ -x /usr/bin/php ]; then
echo "Исполняемый"
fiИсполняемый
Основное отличие PHP-функции в её простом синтаксисе и интеграции с внутренней системой кэширования stat.