Ejecute el archivo de script PHP Perl, pero no esperar a la salida de Windows Server

StackOverflow https://stackoverflow.com/questions/4284796

  •  28-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de ejecutar un script Perl desde un script php. He tenido este trabajo utilizando diversos métodos tales como ejecutivo, popen y proc_open pero tengo un par de problemas para moverse por la que el bueno de Google me NO ESTÁ DANDO las respuestas a.

necesito para ejecutar el script .pl (pasando una variable a la secuencia de comandos que es un número) dentro del archivo php, pero detener el script php de esperar hasta que el .pl ha terminado (el .pl es probable que tome 4 -5 horas se ejecuten en el servidor). Im no esperar ninguna salida de retorno desde el script de Perl (el script de perl registra su salida a una base de datos MySQL) por lo que sólo se necesita estar en ejecución en el servidor y dejar que el equipaje de script php sucesivamente.

Hay algunas barreras para conseguir más allá como su ejecución en la maquina de Windows con Apache, PHP, MySQL.

Creo que he visto la solución para Linux pero que necesita para mantenerse en la máquina Windows.

corriente Im tratando un enfoque proc_open usando el siguiente código (el 35 en la línea proc_open es un ID de prueba que necesito para pasar al script Perl):

$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("file","./error.log","a")
) ;

proc_close(proc_open('perl perlscript.pl 35', $descriptorspec, $pipes));

$i = 0;
while ($i < 1000) {
   echo ++$i;  
}

Ahora bien, este código hace ejecutar el script de perl pero el bucle while he colocado después de que (sólo para pruebas) nunca se ejecuta (no ive esperó a que el script de perl para terminar de ver si lo hace), ya que debe estar esperando el. pl a fin.

¿Fue útil?

Solución 4

Gracias a todos los que respondieron a esta pregunta. Después de mucha investigación y de jugar con diferentes soluciones que finalmente me dieron algo para el trabajo y satisfacer nuestras necesidades. Su lejos de ser perfecto, pero oye, funciona de manera no voy a quejarme demasiado.

Dado que esto parece ser algo que otras personas quieren saber Id pensado acciones ID mi solución.

  1. He descargado un pequeño programa llamado HStart (40kb) desde aquí: http: //www.ntwind.com/software/utilities/hstart.html

  2. Me extrae los archivos en c: \ windows \ system32.

El programa HStart tiene la capacidad de ejecutar archivos por lotes sin necesidad de abrir una ventana de comandos. No lo puedo trabajar llamar directamente el archivo .pl así que tuve que crear un .bat para llamar a la .pl como sigue.

  1. creado un archivo .bat mismo directorio como mi archivo .pl que básicamente llama el script en perl usando Perl instalado localmente y pasando una variable. Como demostración aquí:

    Perl script.pl% 1

  2. En mi script PHP que utiliza el siguiente comando para llamar a mi archivo de Perl.

    $ cmd = 'HStart / NOCONSOLE "run.bat' $ id.. '"> Log.log'; exec ($ cmd);

  3. Al ejecutar el archivo php causas HStart para abrir con NOCONSOLE debido al conjunto del indicador, abra el archivo de Perl con el $ id pasé como una variable y enviar toda la salida de la ventana de la consola oculta a log.log como se especifica con mi mando. Todo lo que puedo ver es perl.exe corriendo en mi administrador de tareas.

Como dije lejos de ser perfecto, pero funciona.

Otros consejos

Veo 3 opciones:

  • Uso fork en el script Perl a la mesa de trabajo real con el proceso principal existente justo después de tenedor. Esto puede no funcionar correctamente o en absoluto en Windows, sin embargo, pero vale la pena intentarlo.

    Por favor, consulte la siguiente "fork en Windows" referencias:

  • Si PHP puede lanzar una petición de URL (similar a LWP o wget de Perl), a continuación, convertir el script de Perl en un script CGI (trivial), palo en su directorio CGI de Apache, y lo llaman través de una URL propia de http://localhost/.... A continuación, el tiempo de espera de la solicitud de URL, ya sea a través de un límite de tiempo PHP iternal o tiempo de espera de HTTP normal en el peor de los casos. En REALMENTE peor de los casos, hacer el mismo truco desde dentro del código Perl Perl ya definitivamente puede soportar tanto la llamada URL a través de las bibliotecas LWP, así como el tiempo de espera a través de alarm()

  • Tener un lanzamiento planificador su script Perl cada X minutos. La secuencia de comandos debe comenzar con la siguiente lógica:. if (-e $flag_file) { unlink $flag_file; do_long_work() } else { exit 0; } donde $flag_file es el lugar especial en el servidor (por ejemplo C:\temp\myscript_start_perl.txt), y do_long_work() contiene el trabajo real que necesitan realizarse

    A continuación, cuando PHP script necesita para dar inicio a la secuencia de comandos Perl, simplemente crea un archivo de pabellón vacío (el mismo C:\temp\myscript_start_perl.txt), que será observado por el script de Perl próxima vez que se ejecuta el programador de la misma.

Hay dos posibilidades

  1. El uso de "inicio" del programa. Usted no será capaz de utilizar tuberías, sólo los argumentos de línea de comandos.

  2. Crear un programa Perl siempre en ejecución (ejecutarse en el inicio o el uso de Win32 :: Daemon). Conectarse a él mediante sockets o http. Es fácil, ya que hay un montón de servidores de listas en CPAN

Además, puede ser posible hacerlo de otro programa Perl usando Win32 :: algún otro módulo CPAN de trabajo o Win32 :: Proceso o.

Hace poco publicó un módulo para tareas como esto: Win32 :: Independiente

Añadir a su script de perl y se convierte en demonio en sí, lo que permite su script PHP para seguir adelante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top