2011-12-17 11 views
10

Escenario:forma más sencilla para iniciar un nuevo proceso/hilo en PHP

  1. alojamiento compartido, por lo que no posibilidad de instalar nuevas extensiones + no CRON
  2. Una solicitud presentada necesita realizar algunos procesos pesados.
  3. quiero la respuesta al cliente para ir lo más rápido posible, y el trabajo pesado para continuar inmediatamente, pero no detiene el cliente.
  4. puede estar en un nuevo hilo (si es posible) también no hay problema con el inicio de un nuevo proceso.

¿Cuál es la mejor manera de hacer esto?

+0

PHP no puede (actualmente) ser multi-hilo. * Mucho * para mi disgusto habitual. – DaveRandom

+0

Bueno, algunas cosas pueden ser emuladas. –

Respuesta

11

En * nix:

exec('/path/to/executable > /dev/null 2>&1 &'); 

En Windows:

$WshShell = new COM('WScript.Shell'); 
$oExec = $WshShell->Run('C:\path\to\executable.exe', 0, false); 

Ambos permita hacer surgir un nuevo proceso que se ejecutará una forma sincrónica, completamente desconectado de la matriz. Siempre que tu anfitrión te permita hacerlo.

+0

¿Puedo cambiar el/dev/null a un archivo de registro de mi elección? –

+0

Creo que sí, siempre que redireccione STDOUT * y * STDERR a algún lugar que no sea el proceso principal, y sufijo con '&', debería funcionar.TBH, siempre acabo de '/ dev/null'ed, así que realmente solo tendrás que chupar y ver ... – DaveRandom

+0

¿Iniciar un proceso externo arbitrario en el alojamiento compartido? Buena suerte con eso. –

1

No hay hilos en PHP. Puede hacer trampa enviando una página HTML que active una llamada Ajax para iniciar el proceso pesado en una nueva solicitud. Pero si se trata de alojamiento compartido, supongo que alcanzará rápidamente los límites de memoria, tiempo o uso de CPU impuestos por su proveedor de alojamiento.

+0

[Evidentemente, hay hilos en PHP ahora] (http://docs.php.net/manual/en/class.thread.php), pero puede que tenga que [instalarlos] (http: //docs.php. net/manual/en/pthreads.installation.php). Sin embargo, esto solo lo aprendí esta noche, así que aún no lo he probado. – Volomike

0
$WshShell = new COM('WScript.Shell'); 
$oExec = $WshShell->Run('C:\xampp\php\php.exe C:\xampp\htdocs\test.php -a asdf', 0, true); 

No se puede pasar argv to test.php.

var_dump($argv); 
+1

Supongo que esto es Windows ...? –

2

Puede buscar en google por clave: php continuar procesando después de cerrar la conexión.

Los siguientes enlaces que se relacionan con su problema, son:

Puede utilizar pertenecen comando para continuar con la ejecución sin que el usuario abortar

ignore_user_abort(true); 
set_time_limit(0); 

Se utiliza para alertar fastcgi_finish_request cliente para detener la salida de respuesta. Y tus scripts continuarán ejecutándose.

Un ejemplo:

// redirecting... 
ignore_user_abort(true); 
set_time_limit(0); 
header("Location: ".$redirectUrl, true); 
header("Connection: close", true); 
header("Content-Length: 0", true); 
ob_end_flush(); 
flush(); 
fastcgi_finish_request(); // important when using php-fpm! 

sleep (5); // User won't feel this sleep because he'll already be away 

// do some work after user has been redirected 
+0

Bienvenido a SO. Debe revisar el formato de su respuesta. A partir de ahora, parece que pones todo en un bloque de código, mientras que parte de tu respuesta no es el código. – Laf

+0

Gracias a Laf. Reformaté mi respuesta. –

Cuestiones relacionadas