2010-12-07 9 views
9

Je crée un script PHP qui sera exécuté via la ligne de commande. Dans le cadre de ce script, il y a des moments où je pourrais avoir besoin de générer un autre script qui pourrait prendre beaucoup de temps. Je ne veux pas bloquer le script original. Si je faisais cela avec JavaScript, je pourrais exécuter des requêtes AJAX en arrière-plan. C'est essentiellement ce que j'essaie de faire ici. Je n'ai pas besoin de savoir quand les fourches sont terminées, juste qu'elles commencent et se complètent. Comment puis-je exécuter ces scripts PHP de manière asynchrone?Comment exécuter un script PHP de manière asynchrone?

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

Vous dites: « Je ne ai pas besoin de savoir quand la fourche complète » et votre code dit « et passer $ article ». Voulez-vous obtenir la sortie ou non? – Jonas

+0

PHP Ne poursuit pas les threads, vous devez forker les processus fils, ou le mieux est de construire un cron – RobertPitt

+0

NeqO - Non, la fourche n'aura pas besoin de retourner quoi que ce soit. – Andrew

Répondre

2

int pcntl_fork (void)

Le pcntl_fork() fonction crée un processus enfant qui diffère du processus père que dans son PID et PPID. Veuillez consulter la page de manuel fork de votre système (2) pour plus de détails sur la manière dont la fourche fonctionne sur votre système.

détails: http://php.net/manual/en/function.pcntl-fork.php

question connexe: PHP: What does pcntl_fork() really do?

contrôle du processus ne devrait pas être activé dans un environnement de serveur Web et des résultats inattendus peut se produire si des fonctions de contrôle des processus sont utilisés dans un serveur web environnement.

détails: http://www.php.net/manual/en/intro.pcntl.php

2

Vous cherchez l'utilisateur ont contribué des notes sur exec, il semble que vous pouvez l'utiliser, consultez:

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 &"); 
    } 
} 
?> 

Cela exécutera $ cmd dans l'arrière-plan (sans fenêtre cmd) sans PHP l'attends t o finir, sur les deux Windows et Unix.

+0

http://www.php.net/manual/fr/fonction.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 
    } 
} 
Questions connexes