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.
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.
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:
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.
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.
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:
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Geniales todos los tutoriales tuyos que he leído por ahora. Y por lo que veo todos van a ser así. Gracias!