2013-01-20 4 views
1

Je veux écrire un script php pour l'exécuter en arrière-plan. qui a besoin de pcntl_fork. Je utiliser cette fonction pour un enfant fourche:Kill fork process

function launchchild($programexe,$programvars) 
{ 
//foreach ($tasks as $key => $v){ 
switch ($pid = pcntl_fork()) { 
    case -1: 
    // @fail 
    die('Fork failed'); 
    break; 

    case 0: 
    // @child: Include() misbehaving code here 
    pcntl_exec($programexe,$programvars); 
    break; 

    default: 
    // @parent 
    //pcntl_waitpid($pid, $status); 
    break; 
} 

//print "Done! :^)\\n\\n"; 
} 

je l'appelle avec un extrait comme ci-dessous tant dans une minute:

$parameters = array('/Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/gather_checks.php', $serialize_triagger, $server_list[$server_choose]); 
launchchild('/Applications/XAMPP/xamppfiles/bin/php',$parameters); // fork a child for parallel processing. 

donc, il fonctionne avec élégance que pour une minute. J'ai vérifié le processus avec 'ps -ax | grep php '. J'ai vu qu'il y a tellement de processus qui ne finissent jamais jusqu'à ce que le code donne une erreur de 35, ce qui signifie que nous n'avons plus de mémoire pour l'exécuter! c'est le résultat de 'ps -ax | grep php »

ps -ax | grep php 
12020 ttys001 0:00.07 /Applications/XAMPP/xamppfiles/bin/php /Applications/XAMPP/xamppfiles/htdocs/ping/senario2/master/main.php 
12021 ttys001 0:00.00 (php-5.3.1) 
12022 ttys001 0:00.00 (php-5.3.1) 
12025 ttys001 0:00.00 (php-5.3.1) 
12028 ttys001 0:00.00 (php-5.3.1) 
12037 ttys001 0:00.00 (php-5.3.1) 
12040 ttys001 0:00.00 (php-5.3.1) 
12043 ttys001 0:00.00 (php-5.3.1) 

quand je décommenter le // pcntl_waitpid (pid $, état de $); ça fonctionne comme un charme sans aucun problème, jamais. mais je ne veux pas que le parent attende le travail des enfants. n'importe quelle chose peut être utile.

Répondre

0

Vous lancez un autre programme/script, de sorte que vous n'avez pas besoin fork, il suffit d'utiliser system() et screen pour la prise terminal (idk si & travaux)

+0

J'ai vérifié tous. exec, system, shell_exec et autres. avec ou sans &. aussi avec nohup. tous d'entre eux seront traitées dans une partie du code pas comme un processus parallèle. –

+0

Vous devez utiliser &, nohup AND en sortie/dev/null, sinon le processus parent attendra la réponse. Utilisez>/dev/null 2> & 1 –

+0

OMG! @BrentBaisley '>/dev/null 2> & 1' ne fonctionne pas. mais '>/dev/null &' a fonctionné! Pourquoi?! Je ne peux pas comprendre ça! Je suis si heureux de résoudre ce problème, problème de 3 heures! –

0

fonctions PCNTL de PHP, comme pcntl_fork, ne devraient pas être utilisé à partir d'un serveur Web, car les processus enfants ne finissent pas correctement nettoyés. (Comme vous l'avez sans doute remarqué.) Ces fonctions sont principalement destinées à être utilisées dans des démons PHP autonomes, et dans des cas particuliers qui ne s'appliquent pas ici.

Utilisez plutôt les fonctions de contrôle de processus de niveau supérieur telles que proc_open(). Si vous devez exécuter un processus en arrière-plan, exécutez-le via un shell avec &.