2010-12-07 21 views
9

Estoy creando un script PHP que se ejecutará a través de la línea de comandos. Como parte de este guión, hay momentos en los que podría necesitar generar/hornear un guión diferente que podría tomar mucho tiempo para completarse. No quiero bloquear el script original para que no se complete. Si estuviera haciendo esto con JavaScript, podría ejecutar solicitudes AJAX en segundo plano. Eso es esencialmente lo que estoy tratando de hacer aquí. No necesito saber cuándo se completan las horquillas, solo que comienzan y se completan.¿Cómo ejecutar un script PHP de forma asincrónica?

¿Cómo puedo ejecutar estos scripts PHP de forma asíncrona?

foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     //start some asynchronous process here, and pass it $item 
    } 
} 
+0

se dice "yo no necesito saber cuando la horquilla completa" y su código dice "y pasarlo $ item". ¿Quieres obtener el resultado o no? – Jonas

+0

PHP No demanda hilos, tiene que bifurcar procesos secundarios, o la mejor forma es construir un cron – RobertPitt

+0

NeqO - No, el tenedor no tendrá que devolver nada. – Andrew

Respuesta

2

int pcntl_fork (void)

El función pcntl_fork() crea un proceso hijo que difiere del proceso padre sólo en su PID y PPID. Consulte la página de manual de la horquilla (2) de su sistema para obtener detalles específicos sobre cómo funciona la horquilla en su sistema.

detalles: http://php.net/manual/en/function.pcntl-fork.php

pregunta relacionada: PHP: What does pcntl_fork() really do?

control de proceso no debe ser activado dentro de un entorno de servidor web y resultados inesperados puede suceder si se utilizan las funciones de control de procesos dentro de un servidor web ambiente.

detalles: http://www.php.net/manual/en/intro.pcntl.php

2

Mirando al usuario contribuyeron notas sobre Exec, parece que se podría utilizar, echa un vistazo a:

http://de3.php.net/manual/en/function.exec.php#86329

<?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
?> 

Esto ejecutará $ cmd en el fondo (sin ventana de cmd) sin PHP esperándolo t o finalizar, en ambos Windows y Unix.

+0

http://www.php.net/manual/en/function.popen.php#92413 – gawpertron

3
$pids = array(); 
foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     $pid = pcntl_fork(); 
     if ($pid == 0) { 
      // you're in the child 
      var_dump($item); 
      exit(0); // don't forget this one!! 
     } else if ($pid == -1) { 
      // failed to fork process 
     } else { 
      // you're in the parent 
      $pids[] = $pid; 
     } 
    } 

    usleep(100); // prevent CPU from peaking 
    foreach ($pids as $pid) { 
     pcntl_waitpid($pid, $exitcode, WNOHANG); // prevents zombie processes 
    } 
} 
Cuestiones relacionadas