Ejecutar comandos desde PHP para Linux

php-logoExisten varias funciones para ejecutar comandos desde php en un servidor linux pero yo me centraré en 3 de ellas: ssh2_exec, system y exec.

La primera de ellas ssh2_exec se ejecuta cuando establecemos una conexión SSH con otro servidor (o el mismo pero esto carece un poco de efecto práctico).

Esta función nos devuelve un stream o FALSE en caso de error, para poder trabajar con los datos devueltos deberíamos hacer lo siguiente:

<?php
$stream = ssh2_exec($connection, "cd /hom");
$errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
// Activar bloqueo para ambos stream
stream_set_blocking($errorStream, true);
stream_set_blocking($stream, true);
// Cualquiera de los dos comandos de abajo recibirá su salida correspondiente. El segundo comando no recibe nada porque no hay error.
echo "Output: " . stream_get_contents($stream);
echo "Error: " . stream_get_contents($errorStream);
// Close the streams      
fclose($errorStream);
fclose($stream);
?>

Ejecutar aplicaciones en segundo plano con PHP y SSH

Y para ejecutar aplicaciones en segundo plano (porque sino el script no continúa hasta que no termine el comando) solo debemos poner ‘&’ al final del comando.

Las funciones system y exec son funciones locales por tanto ambas devuelven una cadena y no un stream así que tratar con ellas es mucho más sencillo. Ambas devuelven la última línea de la salida del comando la diferencia es que system en caso de error devuelve FALSE.

Nota: es aconsejable comparar la función system con el operador ===.

Ejecutar aplicaciones en segundo plano en PHP

Para ejecutar aplicaciones en segundo plano en ambos casos es necesario además de ‘&’ redirigir la salida a un archivo, en mi caso cómo no quiero almacenar esta salida termino el comando con ‘> /dev/null 2>&1 &’.

Comentarios