sábado, 23 de enero de 2010

PHP: Ejecutar comandos en tu linux con exec


Exec, un comando muy potente en php que nos permitirá realizar tareas muy interesantes. Si quieres montar un servicio en línea y no sabes como hacerlo, este comando te salvará la vida. Puedes crear tu propio portal de vídeos, transformador de imágenes, transformador de audio, lo que quieras.

En el ejemplo de hoy, crearemos un sencillo programa que nos transformará una imagen de CD NRG a ISO , mediante el programa nrg2iso. Ponemos este ejemplo porque lanzar un servicio en línea de este tipo sería un disparate debido al tamaño gigantesco de las imágenes de CD y el tráfico que generarían.

En cualquier caso, es un buen ejemplo para ver el comando exec. En el enlace que os puse atrás, podréis instalar el programa. La utilización de este comando será muy sencilla. Como es en local, no usaremos variables del tipo $_POST o $_GET, simplemente usaremos una variable cualquiera llamada $ruta, y como nombre de la imagen usaremos $nombre, quedando algo así:
 <?php
$ruta = "/home/tucuenta/";
$imagen = "nombre_imagen.";
//Transforma imagen nrg a iso en php
echo exec("nrg2iso ".$ruta.$imagen."nrg ".$ruta.$imagen."iso");
?>
 Ejecutaríamos el comando, da igual la ruta, y veríamos por pantalla el resultado de la salida del terminal, del sistema operativo en el que estés. En este caso estamos trabajando bajo Linux por lo que tendríamos la imagen transformada. Esto se puede aplicar a cualquier tipo de formato y conversor, sólo necesitáis un servidor que acepte exec.

9 comentarios:

  1. Saludos, disculpen estoy haciendo una pag PHP con Festival TTS, ejecuto lp sgte:

    $text2wave_cmd = sprintf("text2wave -o %s -scale %d %s",$wave_file,$volume_scale,$speech_file);
    //$text2wave = text2wave -o /opt/lampp/htdocs/webtts/audio/1203051021140.wav -scale 50 /opt/lampp/htdocs/webtts/tmp/1203051021140
    exec($text2wave_cmd);

    el problema es q al ejecutar la funcion exec no realiza nada....pero si coloco el contenido de $text2wave en la terminal de Linux si ejecuta lo que deberia, pero no asi desde mi pag PHP...

    Me podrian orientarme diciendome talves si es alguna configuracion en algun .ini (ya verifique disable_functions y esta vacia)

    De antemano gracias por su pronta respuesta.

    ResponderEliminar
    Respuestas
    1. Haz una prueba sencilla con $resultado = exec('ls');
      var_dump($resultado);

      Si todo funciona debería imprimir algo, aunque para mi me da que tal vevz no te funcione el $text2wave_cmd. Intenta hacer un echo o algo así.

      Si no lo que sí es seguro, son los permisos con los que se ejecuta exec y el directorio donde se guarda.

      No obstante si te da problemas utiliza system, es lo mismo pero más moderno. Yo lo utilizaba en C en vez de exec!

      Eliminar
  2. hey primero gracias por responder....ejecute lo q me dijiste y dio como resultado esto:

    string(3) "tmp"

    le hice un echo a text2wave_cmd y dio esto

    text2wave -o /opt/lampp/htdocs/webtts/audio/1203051021140.wav -scale 50 /opt/lampp/htdocs/webtts/tmp/1203051021140

    esto mismo lo ejecuto en la terminal y si funciona pero desde php es el problema

    ya ejecute tambien con system pero igual estoy en las mismas

    ResponderEliminar
    Respuestas
    1. Y para hacerlo más rápido escribeme por twitter xD

      Eliminar
  3. Creo que sé lo que ocurre. Tu interprete bash tiene por defecto unos directorios donde buscar y php no.

    Pon la ruta directa:
    /usr/bin/text2wave -o /opt/lampp/htdocs/webtts/audio/1203051021140.wav -scale 50 /opt/lampp/htdocs/webtts/tmp/1203051021140

    o la que sea, seguro que eso lo arregla xD

    ResponderEliminar
    Respuestas
    1. pues la verdad men sigue lo mismo, no se si tu talves puedes probar el cod q yo tengo y si te funciona pues no seria el cod verdad...si gustas pues me das tu correo y te envio el codigo

      disculpa por las molestias

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Saludos, he estado probando lo sgte:

    $text2wave_cmd = "text2wave -o /opt/lampp/htdocs/webtts/audio/1204040137560.wav -scale 50 /opt/lampp/htdocs/webtts/tmp/1204040137560";

    exec($text2wave_cmd,$salida,$error);

    echo "Salida-->";
    print_r($salida);
    echo "
    Error--> $error";

    Lo cual muestra lo sgte:

    Salida-->Array ( )
    Error--> 1

    Entiendo q cuando no hay error deberia mostrar Error--> 0

    Me pueden ayudar diciendo q significa es el Error-->1 y como se podria solucionarlo.

    Gracias.

    ResponderEliminar
  6. He hecho una prueba asi:

    exec("whoami",$salida,$error);
    echo "Salida-->";
    print_r($salida);
    echo "
    Error--> $error";
    echo "
    ";

    E imprime esto:

    Salida-->Array ( [0] => nobody )
    Error--> 0

    Por si acaso sirva de ayuda.

    Talves sea por permisos q da Error-->1, porq apache se esta ejecutando con el usuario nobody.

    De ser asi como hago para q se ejecute como root.?

    ResponderEliminar