php

PHP: ejecutar un comando del sistema

En este post te mostraré cómo ejecutar un comando desde PHP como si lo estuviéramos invocando desde la terminal, a través de exec.

Esto va a funcionar en Windows y Linux. Vamos a ver cómo ejecutar un comando, obtener su salida y su código de salida.

Sobre exec

Esta función nos permite invocar a un comando desde PHP. Recuerda que debes tener cuidado si los argumentos son proporcionados por el usuario, y para ello deberías usar escapeshellarg.

Pero bueno, veamos. La sintaxis de exec es:

exec(comando, salidaDelComando, codigoDeSalida);

De modo que como primer argumento recibe el comando que se va a ejecutar, y después le estamos indicando las variables en donde se pondrá la salida del comando y el código del mismo, en ese orden.

Por cierto, la salida del comando será un arreglo en donde cada elemento será una línea de la salida.

Ejemplo de exec con PHP

Veamos un primer ejemplo. En este caso vamos a listar los archivos en el directorio actual. Primero con Linux, para ese caso usamos el comando ls y el código queda así:

<?php
$comando = "ls";
exec($comando, $salida, $codigoSalida);
echo "El código de salida fue: " . $codigoSalida;
echo "\n";
echo "Ahora imprimiré las líneas de salida:";
foreach($salida as $linea){
        echo $linea;
        echo "\n";
}

Y la salida la vemos a continuación:

Ejecutar comando con PHP usando exec en Linux

Como puedes ver, estamos obteniendo la salida correctamente (si bien no es exactamente la misma, eso puede ser porque ls no es tan predecible y se supone que deberíamos usar find, pero bueno, ese no es el punto).

Ahora en Windows solo cambiaría el comando, que sería dir:

<?php
$comando = "dir";
exec($comando, $salida, $codigoSalida);
echo "El código de salida fue: " . $codigoSalida;
echo "\n";
echo "Ahora imprimiré las líneas de salida:";
foreach($salida as $linea){
        echo $linea;
        echo "\n";
}

Y la salida igualmente sería correcta. En este caso dir se comporta de manera idéntica ya sea desde PHP o desde la línea de comandos. Te repito que en el ejemplo anterior fue porque ls es un poco raro y no puedo exponer todo en este post, ya que no es el punto.

Invocar comando de Windows desde PHP con exec

En este caso solo estamos invocando un comando desde PHP para listar los archivos del directorio actual, pero puede ser cualquier programa y cualquier comando.

Nota: en los ejemplos estoy ejecutando PHP desde un archivo. Esto no es obligatorio, ya que el código debería funcionar desde Apache u otro medio.

Nota 2: Obviamente el comando puede llevar argumentos, no se limita a una sola palabra.

La importancia del código de salida

Todos los programas (o los que están bien programados) deberían salir con un código de salida 0. Podemos usar este código de salida para ver si el comando fue ejecutado correctamente.

Veamos este ejemplo en donde el comando (dirs, y no dir) ni siquiera existe. Hay muchos códigos de salida, pero el 0 es el único que indica algo exitoso.

<?php
$comando = "dirs";
exec($comando, $salida, $codigoSalida);
if ($codigoSalida === 0) {
 echo "Ahora imprimiré las líneas de salida:";
 foreach ($salida as $linea) {
  echo $linea;
  echo "\n";
 }
} else {
 echo "Error ejecutando el comando. El código es: " . $codigoSalida;
}

Al ejecutarlo, tenemos lo siguiente:

Código de salida al ejecutar comando en PHP

En este caso no imprimimos la salida, ya que el código fue 1. De este modo podemos detectar errores, ya que aunque el programa exista, si hay un error, el código de salida no será 0.

Y así es como podemos invocar a comandos de la terminal desde PHP, ya sea en Windows o Linux.

Recuerda que si tienes problemas debes verificar que el programa sea accesible desde PHP, tengas los permisos necesarios, no haya problemas de rutas, etcétera.

Para terminar te dejo con más tutoriales de programación en PHP.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Geniales todos los tutoriales tuyos que he leído por ahora. Y por lo que veo todos van a ser así. Gracias!

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

3 días hace

Esta web usa cookies.