PHP exec() como Proceso en Segundo Plano (Entorno Windows Wampserver)


Estoy tratando de configurar un archivo de activación php que activará un proceso en segundo plano. (ver esta pregunta)

Estoy haciendo esto en un entorno Wampserver de Windows.

Así que por ejemplo tengo trigger.php que ejecuta la función exec que llama a mi backgroundProcess.php para ser analizado y ejecutado.

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

¿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, quiero trigger.php simplemente activar el proceso de fondo 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);
Author: Community, 2011-03-20

6 answers

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);
 24
Author: Emmanuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-20 09:41:38

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.

Encontró la solución :

$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 : Publicar la misma respuesta al otro hilo (PHP en una máquina windows; Iniciar proceso en segundo plano) ya que estos 2 enlaces me ayudaron mucho en hacer algunas investigaciones sobre esto.

 9
Author: Rohit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:59

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

Nota:

Si un programa se inicia con esto función, para que continúe en segundo plano, la salida del programa debe ser redirigido a un archivo u otro flujo de salida. Fallar hacer esto hará que PHP se cuelgue hasta finaliza la ejecución del programa.

Y una pregunta similar respondí: Llame a otro script PHP y devuelva el control al usuario antes de que el otro script complete

 4
Author: JohnP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

Es posible que deba 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 la tarea en cola, idealmente en la base de datos, y procesarlas periódicamente. Hay trabajos de chron en sistemas basados en Linux. En Windows, puede usar un programador para iniciar el proceso de fondo.php.

 3
Author: Shamim Hafiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-20 07:32:19

Bien puede ser que cuando se utiliza el exec() en un entorno windows que la redirección es a NUL:. /dev/null es un archivo null *nix.

 1
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-30 03:06:18

Además de la respuesta de Rohit anterior, edité su solución para trabajar en Windows 10 PHP 7.0.3:

pclose(popen("start /B ". $cmd, "w"));
 0
Author: William N Irwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-16 19:28:40