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.
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. –
Vous devez utiliser &, nohup AND en sortie/dev/null, sinon le processus parent attendra la réponse. Utilisez>/dev/null 2> & 1 –
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! –