Maison  >  Article  >  développement back-end  >  Comment implémenter le multi-processus en php

Comment implémenter le multi-processus en php

王林
王林original
2020-08-26 13:31:333486parcourir

Comment implémenter le multi-processus en PHP : via les extensions pcntl et posix. Selon les besoins, nous pouvons utiliser la fonction pcntl_fork() pour créer un processus enfant et la fonction pcntl_wait() pour bloquer le processus en cours.

Comment implémenter le multi-processus en php

le multi-processus php nécessite pcntl, prise en charge de l'extension posix.

La mise en œuvre multi-processus ne peut être effectuée qu'en mode cli. Dans un environnement de serveur Web, des résultats imprévisibles peuvent survenir.

(Tutoriel vidéo recommandé : Tutoriel vidéo php )

Fonctions de base multi-processus :

pcntl_fork (créer un processus enfant), pcntl_wait (Blocage du processus en cours)

Introduction détaillée :

pcntl_fork:

est appelé deux fois et renvoie le pid du processus enfant dans le processus parent, 0 dans le processus enfant et -1 en cas d'erreur .

pcntl_wait ( int &$status [, int $options ] ):

Bloque le processus en cours jusqu'à ce qu'un processus enfant se termine ou reçoive un signal pour terminer le processus en cours, et le SIGCHLD envoyé par le processus enfant pour terminer ne l'est pas. dénombré. Utilisez $status pour renvoyer le code d'état du processus enfant, et vous pouvez spécifier le deuxième paramètre pour indiquer s'il est appelé en état de blocage

mode de blocage. La valeur de retour de la fonction est le pid du processus enfant. S'il n'y a pas de valeur de retour de processus enfant Is -1;

Appelée en mode non bloquant, la fonction peut également renvoyer 0 lorsqu'un processus enfant est en cours d'exécution mais n'est pas terminé.

pcntl_waitpid ( int $pid , int &$status [, int $options ] )

La fonction est la même que pcntl_wait, la différence est que waitpid est le processus enfant qui attend le pid spécifié. Lorsque pid est -1, pcntl_waitpid est identique à pcntl_wait. Les informations d'état du processus enfant sont stockées dans $status dans les fonctions pcntl_wait et pcntl_waitpid.

(Tutoriels associés recommandés : Tutoriel graphique php )

Exemple :

Un nombre fixe de processus enfants sont toujours exécutés en php.

Utilisez les fonctions de base telles que pcntl_fork (créer un processus enfant), pcntl_wait (bloquer le processus en cours) selon les besoins

Implémentation du code :

<?php

//最大的子进程数量
$maxChildPro = 8;

//当前的子进程数量
$curChildPro = 0;

//当子进程退出时,会触发该函数,当前子进程数-1
function sig_handler($sig)
{
    global $curChildPro;
    switch ($sig) {
        case SIGCHLD:
            echo &#39;SIGCHLD&#39;, PHP_EOL;
            $curChildPro--;
            break;
    }
}

//配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
declare(ticks = 1);

//注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
pcntl_signal(SIGCHLD, "sig_handler");

while (true) {
    $curChildPro++;
    $pid = pcntl_fork();
    if ($pid) {
//父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续
        if ($curChildPro >= $maxChildPro) {
            pcntl_wait($status);
        }
    } else {
//子进程运行代码
        $s = rand(2, 6);
        sleep($s);
        echo "child sleep $s second quit", PHP_EOL;
        exit;
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn