Categorías
Tecnologia

Cómo ejecutar un programa X11 desde PHP

Si alguna vez necesitas ejecutar un programa que requiera usar interfaz gráfico desde un script PHP a través de Apache, seguramente vas a tener que pelearte mucho con Linux para conseguirlo. Así que por si alguien lo necesita y para acordarme yo mismo si reinstalo el ordenador, en este post voy a contar la manera de hacerlo funcionar.

Quizás si nunca has necesitado ejecutar un programa X11 desde PHP a través de Apache te preguntes para qué lo puede necesitar alguien. Pues por ejemplo, en mi caso, para crear un interfaz de usuario para gestionar localmente. En concreto, tenía la necesidad de lanzar el programa kdiff3 (comparación gráfica de versiones de archivos).

Lo más habitual es que si necesitas ejecutar un programa X11 desde PHP sea debido a la creación de un interfaz en local para alguna tarea y, la verdad, creo que usar PHP + HTML para ello es una solución realmente buena dado que te evita tener que vivir a base de feos y a veces crípticos scripts de Perl y soluciones similares. Pero también cabe la posibilidad de que necesites ejecutar programas X11 desde PHP a través de Apache en un servidor (por ejemplo, para hacer uno de esos típicos servicios web que crean thumbnails de páginas web). En ese caso, obviamente, el programa a lanzar sería un navegador (Mozilla, Chrome…) y el resultado no se podría mostrar por pantalla. Se haría a través de una sesión de X11 virtual. Pero esa es otra historia, la técnica que voy a explicar aquí y que a mi me ha funciona perfectamente es solo para cuando tu script PHP está instalado localmente. Para el caso de un interfaz virtual, hay algo de información aquí que podría ser de interés (yo no lo he probado).

Por supuesto, deben existir más formas de ejecutar un programa X11, seguramente mejores, pero yo no las he conseguido hacer funcionar. El método se basa en tres pasos:

  1. Hacer que el usuario www-data (que en mi caso es el usuario que ejecuta Apache, pero puede que varíe en otros casos) pueda ejecutar kdiff3 sin contraseña:$ sudo visudoy añadir al final:

    www-data ALL = PASSWD: ALL, NOPASSWD: /usr/bin/kdiff3

  2. Añadir la variable de entorno DISPLAY (aunque creo que no es necesario en la mayoría de los casos, ver punto 3):$ vi /etc/environment

    y añadir al final:

    DISPLAY=:0.0

  3. Ejecutar el comando desde PHP como:$cmd = "sudo /usr/bin/kdiff3 -display :0 -m $file.def.old $file $file.def -o $file";
    exec(sprintf("%s > /dev/null 2>&1 & echo $! >> /dev/null", $cmd));

    Importante el «sudo» que hace que la aplicación adquiera privilegios de root necesarios para ejecutarse (no siempre es necesario) y el «-display :0» que le indica a kdiff3 qué interfaz ha de usar para mostrar su ventana (debería sobrar con añadir al entorno la variable DISPLAY, pero por alguna razón no siempre es así).

Con estos simples pasos deberías poder ejecutar cualquier programa X11 desde PHP. En caso de que no fuera posible, debes comprobar el log de Apache dónde suele aparecer alguna pista (por ejemplo que no se ha podido conectar al X server o que no tienes privilegios suficientes para ejecutar el programa) y también es interesante loguearse con el mismo usuario que se ejecuta Apache y probar a lanzar el programa a ver qué pasa.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *