Recherche…


Multiprocessing utilisant des fonctions de fourche intégrées

Vous pouvez utiliser des fonctions intégrées pour exécuter des processus PHP sous forme de fourchettes. C'est le moyen le plus simple de réaliser un travail parallèle si vous n'avez pas besoin que vos threads se parlent.

Cela vous permet de placer des tâches exigeantes (comme télécharger un fichier sur un autre serveur ou envoyer un courrier électronique) à un autre thread pour que votre script se charge plus rapidement et puisse utiliser plusieurs cœurs. savoir ce que font les enfants.

Notez que sous Windows, une nouvelle invite de commande apparaîtra pour chaque fourchette démarrée.

master.php

$cmd = "php worker.php 10";
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') // for windows use popen and pclose
{
    pclose(popen($cmd,"r"));
}
else //for unix systems use shell exec with "&" in the end
{
    exec('bash -c "exec nohup setsid '.$cmd.' > /dev/null 2>&1 &"');
}

worker.php

//send emails, upload files, analyze logs, etc
$sleeptime = $argv[1];
sleep($sleeptime);

Créer un processus enfant à l'aide de fork

PHP a intégré la fonction pcntl_fork pour créer un processus enfant. pcntl_fork est identique à fork dans unix. Il ne prend aucun paramètre et renvoie un entier qui peut être utilisé pour différencier le processus parent et le processus enfant. Considérez le code suivant pour l'explication

<?php
    // $pid is the PID of child
    $pid = pcntl_fork();
    if ($pid == -1) {
         die('Error while creating child process');
    } else if ($pid) {
         // Parent process
    } else {
         // Child process
    }
?>

Comme vous pouvez le voir, -1 est une erreur dans fork et l'enfant n'a pas été créé. Lors de la création d'un enfant, nous avons deux processus en cours d'exécution avec un PID séparé.

Une autre considération est un zombie process ou un zombie process defunct process lorsque le processus parent se termine avant le processus enfant. Pour empêcher un processus zombie, ajoutez simplement pcntl_wait($status) à la fin du processus parent.

pnctl_wait suspend l'exécution du processus parent jusqu'à la fin du processus enfant.

Il est également intéressant de noter que le zombie process peut pas être tué en utilisant le signal SIGKILL .

Communication interprocessus

La communication interprocessus permet aux programmeurs de communiquer entre différents processus. Par exemple, considérons que nous devons écrire une application PHP capable d'exécuter les commandes bash et d'imprimer la sortie. Nous utiliserons proc_open , qui exécutera la commande et renverra une ressource avec laquelle nous pouvons communiquer. Le code suivant montre une implémentation de base qui exécute pwd dans bash partir de php

<?php
    $descriptor = array(
        0 => array("pipe", "r"), // pipe for stdin of child
        1 => array("pipe", "w"), // pipe for stdout of child
    );
    $process = proc_open("bash", $descriptor, $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], "pwd" . "\n");
        fclose($pipes[0]);
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        $return_value = proc_close($process);

    }
?>

proc_open exécute la commande bash avec $descriptor tant que spécifications de descripteur. Après cela, nous utilisons is_resource pour valider le processus. Une fois cela fait, nous pouvons commencer à interagir avec le processus fils en utilisant $ pipes qui est généré selon les spécifications du descripteur.

Après cela, nous pouvons simplement utiliser fwrite pour écrire dans stdin du processus enfant. Dans ce cas, pwd suivi du retour chariot. Enfin, stream_get_contents est utilisé pour lire stdout du processus enfant.

Rappelez-vous toujours de fermer le processus enfant en utilisant proc_close () qui mettra fin à l'enfant et renverra le code de statut de sortie.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow