W3docs

is_executable()

La función is_executable() de PHP comprueba si un archivo existe y puede ejecutarse. Aprende su sintaxis, valores de retorno y casos de uso.

¿Qué es la función is_executable()?

is_executable() es una función nativa de PHP que indica si un archivo existe y puede ejecutarse como un programa por el proceso actual. Devuelve true solo cuando ambas condiciones se cumplen; de lo contrario, devuelve false.

"Ejecutable" aquí significa que el sistema operativo permitiría ejecutar el archivo — por ejemplo, un script de shell, un binario compilado o un .exe en Windows. Un archivo de texto normal o un archivo fuente .php normalmente no es ejecutable, aunque PHP pueda leerlo.

Esta página cubre la sintaxis, lo que realmente significa el valor de retorno, cómo difiere la verificación entre sistemas operativos y los problemas comunes (caché, archivos inexistentes, bits de permisos) que suelen causar errores.

Sintaxis

is_executable(string $filename): bool
ParámetroDescripción
$filenameRuta al archivo que se va a comprobar. Puede ser relativa al directorio de trabajo del script o una ruta absoluta.

Valor de retornotrue si el archivo existe y es ejecutable, false en caso contrario. PHP también emite un E_WARNING si la ruta no es válida (por ejemplo, si no se puede recorrer un directorio en la ruta).

Un ejemplo básico

php— editable, runs on the server

La función devuelve un boolean, por lo que encaja directamente en una condición if. Aquí apuntamos al binario de PHP; en un servidor Linux típico esa ruta es ejecutable y se ejecuta la primera rama. La ruta exacta varía según el sistema, por eso el siguiente ejemplo crea un archivo que controlamos completamente.

Crear y probar un archivo

La verificación es más significativa cuando controlas los bits de permisos del archivo. El ejemplo siguiente escribe un pequeño script de shell, lo marca como ejecutable con chmod() y confirma el resultado:

<?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);

Dos cosas a tener en cuenta:

  • El archivo no es ejecutable hasta que se establece el bit de permiso de ejecución, aunque ya existiera y fuera legible.
  • Después de cambiar los permisos debes llamar a clearstatcache() (ver más abajo).

Consulta chmod() para ver cómo el modo octal 0755 se corresponde con los permisos de propietario/grupo/otros.

El problema con la caché de stat

PHP almacena en caché el resultado de las llamadas stat al sistema de archivos (usadas por is_executable(), is_readable(), is_writable(), file_exists() y funciones similares) por motivos de rendimiento. Si cambias los permisos de un archivo durante la misma solicitud y lo vuelves a comprobar, puede que obtengas la respuesta desactualizada:

<?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);

Llama a clearstatcache() después de cualquier chmod(), chown(), rename() o unlink() si pretendes volver a comprobar la misma ruta en la misma ejecución.

Comportamiento según el sistema operativo

  • Linux / macOS — el resultado sigue el bit de ejecución Unix (x) para la clase de usuario/grupo/otros correspondiente. Un archivo con modo 0644 no es ejecutable; 0755 sí lo es.
  • Windows — no existe el bit de permiso de ejecución. PHP infiere si es "ejecutable" a partir de la extensión del archivo: las rutas que terminan en .exe, .bat, .cmd o .com se tratan como ejecutables. Antes de PHP 7.4, is_executable() siempre devolvía false en Windows, así que prueba en tu versión de destino.

Debido a estas diferencias, nunca asumas que un script que devuelve true en Linux hará lo mismo en Windows, ni al revés.

¿Cuándo utilizarla?

  • Antes de ejecutar un programa externo con exec(), shell_exec() o proc_open() — verifica que el binario realmente se puede ejecutar y muestra un error claro si no es así, en lugar de fallar en el interior de la llamada.
  • Despliegue / comprobaciones de estado — confirma que un script auxiliar (un trabajo cron, un hook de compilación) tiene los permisos correctos después de ser copiado o descargado del control de versiones, donde el bit de ejecución a veces se pierde.
  • Control de seguridad — combinado con una ruta fija, rechaza ejecutar cualquier cosa que no sea un ejecutable conocido con los permisos adecuados.

Funciones relacionadas

is_executable() pertenece a una familia de comprobaciones de permisos y tipo — elige la que se corresponda con la pregunta que deseas hacer:

  • is_file() — ¿la ruta es un archivo normal (no un directorio)?
  • is_dir() — ¿la ruta es un directorio?
  • is_readable() — ¿se puede leer el archivo?
  • is_writable() — ¿se puede escribir en el archivo?
  • file_exists() — ¿existe la ruta (archivo o directorio)?
  • fileperms() — lee los bits de permisos sin procesar.
  • chmod() — cambia los bits de permisos de un archivo.

Conclusión

is_executable() devuelve true solo cuando un archivo existe y tiene permiso de ejecución para el proceso actual. Recuerda tres cosas: el resultado depende del sistema operativo (bit de ejecución Unix frente a extensión en Windows), está almacenado en caché por stat así que llama a clearstatcache() después de cambiar los permisos, y es más útil como guardia antes de ejecutar programas externos.

Práctica

Práctica
¿Qué hace la función is_executable() en PHP?
¿Qué hace la función is_executable() en PHP?
Was this page helpful?