16
oct
2009

Ejecutar aplicación con PHP y Windows

windows apache php Ejecutar aplicación con PHP y Windows

Windows + Apache + PHP

Estos días en la oficina hemos tenido que echar mano de un windows y montarle Apache, PHP y MySQL para un proyecto que estamos desarrollando. Sí no había otra forma o windows o nada, por eso digo lo de “nunca cerrar las puertas a nadie” bueno en este caso a “nada”.

Sí Windows tendrás sus cosas malas pero en este caso nos está funcionando a las mil maravillas.

Os cuento hemos desarrollado una aplicación que necesita generar un tipo concreto de ficheros que en Linux se nos hacía bastante complicado generar con la suficiente calidad y no nos quedó otro remedio que echar mano de windows.

Los problemas llegaron cuando desde el código PHP no éramos capaces de lanzar un programa, siempre nos encontrábamos con el error,

“programatal.exe” no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.

Buscando en Internet encontramos que teníamos que modificar en el php.ini la siguientes opciones:

  • safe_mode= off
  • safe_mode_exec_dir= On

También es necesario modificar el servicio del apache para darle permisos para permitir al servicio “interactuar con el escritorio”, para ello hacemos click en el botón Inicio->Ejecutar y escribimos “Services.msc” ( sin las comillas ), se nos abrirá el “gestor de servicios” de windows, tendremos que hacer click con el botón derecho en el Apache y click en propiedades. Ahora en la ventana que se nos ha abierto haremos click en “Inicio sesión” y marcaremos la opción “Permitir a los servicios que interactúen con el escritorio”.

Con estos pasos ya deberíamos poder ejecutar mediante la shell de windows un php y que éste lanze cualquier aplicación. En nuestro caso fue imposible, sí podíamos lanzar, por ejemplo, la calculadora de windows, el bloc de notas pero no una aplicación externa a windows.

Solución? La única solución que encontramos y que está funcionando perfectamente, es el crear un acceso directo al programa en la carpeta donde está nuestro fichero php.

El motivo por el cual no podíamos lanzar nuestra aplicación aún está por descubrir, la falta de tiempo no nos ha dejado investigar un poco más el por qué, aunque teóricamente es una medida de seguridad el no permitir ejecutar programas externos fuera del directorio del php que se está ejecutando.

  • http://www.camobel.com muebles en madrid

    gracias por la información, sera muy útil

    • http://www.algunascosas.com wiki

      No hay de que, cualquier cosa por aquí estamos

  • http://www.camobel.com muebles en madrid

    gracias por la informacion

  • http://www.algunascosas.com wiki

    Hola Daniel, en principio debe abrirte el programa en primer plano por las pruebas que hicimos… estarás ejecutando el exec con un & al final?

  • Daniel

    Hola.

    Todo funciona bien pero la aplicación corre en background no puedo mostrar la interfaces.. por ejemplo la calculadora o word corren como proceso pero no levantan sus interfaces, como hago para que se vean ?.

    Windows 7

    Wampserver

    php 5.2.11

  • http://www.algunascosas.com wiki

    Hola Alan, me alegro de que te haya funcionado el tema del "safe_mode_exec_dir" a veces es mejor dejarlo en On, pero como se suele decir…"si funciona no toques nada" ;-)

  • Alan

    Buena explicación me funciono todo bastante bien, con aplicaciones de windows y externas, solamente modifique

    safe_mode_exec_dir=

    Lo deje en blanco y todo perfecto

  • J0r

    hola, antes que nada gracias a todos por compartir problemas y soluciones. En mi caso es un "problema" lo que quiero hacer es poder abrir la aplicacion que viene por defecto en el escaner, escanear y guardar la imagen todo esto es php.. Gracias de ante mano

  • wiserlander

    Se me olvido quitar las etiquetas de Php =), pues no se ve el codigo en el primer post :( )

    $file="archivo.bat";

    $call = $file;

    pclose(popen('start /b '.($call).'', 'r'));

  • wiserlander

    Hola.

    En mi caso queria controlar las salidas digitales del puerto paralelo, pero a travez de botones en una web del servidor local (localhost) y funciona!

    En Win7 – 64bit enterprise, Xamp, todo funcina perfectamente, pero no con Exec, pues no hacia lo que yo queria =)

    Por si a alguien le viene bien, con el siguiente codigo y todos los pasos mencionados arriba del todo deveria funcionar !

    //Parte de Php

    //Se puede poner un auto refresco Jscript a la pagina Php

    window.self.location="/?enmodo=Dev";

    //Parte Bach -> Ejemplar.bat

    //Para encender algo:

    ECHO OFF@

    START C:programa_a_arrancar.exe

    EXIT

    //para apagar algo:

    @echo off

    taskkill /s Taller /im nombre_proceso_a_matar.exe

    exit;

    En windows xp pro tambien vale la forma de matar un proceso, pero en windows xp home la cosa cambia.

    En vez de usar TASKKILL usaremos -> TSKILL asi de simple.

    Saludos

  • ALeX

    Después de intentarlo con .bat pasandole la ruta del archivo a abrir, con el acceso directo, etc… lo he conseguido, pero con un problema. Y es que php sigue cargando o esperando una respuesta hasta que no cierres la aplicación que has ejecutado. El comando seria muy sencillo:

    - exec('start "office" "C:Program FilesMicrosoft OfficeOffice12winword.exe"',$respuesta);

    print_r($respuesta);

    pero me occure lo que os comentaba. Asique tras horar de buscar, encontré esto:

    - http://www.2mdc.com/blogs/administracion-de-siste…

    funciona muy bien y rápido, asique para salir del paso está muy bien.

    no me gusta el uso de aplicaciones de terceros, pero por ahora no he encontrado otro remedio.

    Por cierto, todo esto viene a raíz de intentar convertir videos a través de php y lo he conseguido con ffmepg y mencoder (para windows y linux) que permiter convertir videos y audio a través de consola.

    pagina oficial:

    - http://www.ffmpeg.org/

    descargar version para windows:

    - http://ffmpeg.arrozcru.org/autobuilds/

    un saludo :)

  • http://www.algunascosas.com wiki

    Hola Jenmos, claro que sí. Es muy simple, tan solo debes incluir en tu script la llamada a cualquiera de las funciones de ejecución de comando de sistema, shell_exec, exec, system…

    Échale un vistazo al manual de PHP.

    Salu2

  • jenmos

    Buenas noches, si alguien me puede ayudar con un problemita que tengo y no se como resolverlo se lo agradeceria muchisimo, me gustaria saber si es posible desde un enlace hacer el llamado para que una aplicacion se ejecute???

  • Juan

    Gran aporte.Pero me gustaria saber dentro del codigo php, que instruccion se utiliza para arrancar los diferentes programas como Microsoft Office, winamp…

    Espero esplicarme y me puedan ayudar.

    Gracias

    • http://www.algunascosas.com wiki

      Hola Juan, para poder ejecutar aplicaciones desde PHP dispone de varios comandos:

      shell_exec();
      system();
      exec();

      Échale un vistazo al manual de PHP.

  • nox

    exelente!!!

  • http://www.algunascosas.com wiki

    Espero que te sirva Shomelit, cualquier duda plantéala por aquí e intentamos solucionarla.

    Salu2

  • Shomelit

    Guaw… Tengo mas de una semana buscando informacion de como poder hacer esto; y todos me daban en la cara un retundo no!!!. Yo tambien necesito ejecutar el microsoft office y servicios de mensajeria instantanea para intranet.. Espero que estos datos me ayuden a logralo!! Muchas Gracias por compartir la información!!