2011-03-20 22 views
24

Estoy intentando configurar un archivo de activación php que desencadenará un proceso en segundo plano. (Consulte this question)PHP exec() como proceso en segundo plano (Windows Wampserver Environment)

Estoy haciendo esto en un entorno Windows Wampserver.

Entonces, por ejemplo, tengo trigger.php que ejecuta la función exec que requiere que mi backgroundProcess.php se analice y ejecute.

Sin embargo, el problema es que mi archivo trigger.php está esperando que el comando exec() termine de ejecutar backgroundProcess.php antes de que se detenga. El proceso en segundo plano se ejecuta durante aproximadamente 20-30 segundos, y trigger.php está esperando todo ese tiempo hasta que backgroundProcess.php haya finalizado por completo.

¿Eso tiene sentido? Aquí está el archivo trigger.php que ejecuta el comando exec()

exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &'); 

Básicamente, estoy queriendo trigger.php sólo desencadenar la backgroundProcess y no esperar a que termine.


EDITAR

Problema resuelto con el siguiente comando:

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false); 
+0

Este han estado causando problemas a mí de una manera aleatoria. Lanzar excepciones sobre no poder ejecutar el comando. Verifica mi respuesta. –

+0

¿Y qué hay en el archivo backgroundProcess.php? – user3120717

Respuesta

23

Problema resuelto con el siguiente comando:

$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false); 
+0

Esto me ha estado causando problemas de forma aleatoria. Lanzar excepciones sobre no poder ejecutar el comando. Verifica mi respuesta. –

+1

@Muhammad Gelbana Usted no tiene una respuesta en esta pregunta. ¿Desea ser un poco más específico o vincular a la respuesta a la que se refiere? – computrius

+2

¡Fue eliminado! De todos modos, aquí hay un resumen de lo que escribí 'exec (" CMD/C inicia tu comando aquí "); Creo que el parámetro/C no es necesario, pero estoy más seguro. Prefija su comando con dirname (__ FILE__) si desea ejecutar en el directorio actual del script. Esto solo puede funcionar si el comando de inicio existe en su máquina Windows. –

3

Es posible que tenga que cambiar su enfoque de implementación. Tener que esperar tanto tiempo sería una molestia para el usuario de su aplicación y fatal para toda la aplicación.

Para tales tareas, generalmente es mejor poner en cola la tarea, idealmente en la base de datos, y procesarlas periódicamente. Hay trabajos cron en sistemas basados ​​en Linux. En Windows, puede utilizar un planificador para iniciar el backgroundProcess.php.

+1

No es algo que se pueda poner en cola. Es una conexión ssh a un servidor remoto y procesa algunas cosas. – Emmanuel

4

Del manual: http://www.php.net/manual/en/function.exec.php

Nota:

Si un programa se inicia con esta función , con el fin de que continúe ejecuta en segundo plano, la salida del programa debe ser redirigido a un archivo u otro flujo de salida. Si falla , hará que PHP se cuelgue hasta que finalice la ejecución del programa.

Y una pregunta similar respondí: Call another PHP script and return control to user before the other script completes

+0

@JohnP - Sí, pero pensé que estaba haciendo eso con el bit '> C: \ wamp \ bin \ php \ php'.phpversion(). '\ Dev \ null &' al final? – Emmanuel

+0

Creo que necesita crear un descriptor de archivo y pasarlo como el segundo parámetro. No solo canalizarlo. – JohnP

+0

@JohnP - No he escuchado acerca de un descriptor de archivo antes ... Al menos no ese término. ¿Podría dar un ejemplo rápido? – Emmanuel

1

es muy posible que al utilizar el exec() en un entorno de ventanas que se pueden redirección es NUL: . /dev/null es un archivo * nix null.

10

Intenté lograr lo mismo en un servidor Windows 2000 con PHP 5.2.8.

Ninguna de las soluciones funcionó para mí. PHP siguió esperando la respuesta.

encontrado la solución sea:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php"; 
pclose(popen("start /B ". $cmd, "a")); // mode = "a" since I had some logs to edit 

ps: Publicación de la misma respuesta que el otro hilo (PHP on a windows machine; Start process in background) ya que estos 2 enlaces me han ayudado mucho en hacer una cierta investigación sobre esto.

+0

Encontré que este método es muy sólido en Win7 con PHP 5.4 – JoshuaDavid

0

Además de la respuesta de Rohit arriba, editado su solución para funcionar en Windows 10 PHP 7.0.3:

pclose(popen("start /B ". $cmd, "w")); 
Cuestiones relacionadas