Maison  >  Article  >  développement back-end  >  Analyse de la programmation multi-processus PHP

Analyse de la programmation multi-processus PHP

藏色散人
藏色散人avant
2021-04-15 09:12:182770parcourir

Recommandé : "Tutoriel vidéo PHP"

Programmation multi-processus PHP

Avantages de l'utilisation de plusieurs processus process :

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源
    2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.

Pour implémenter le multi-processus en PHP, c'est parti.

Nous devons installer l'extension pcnt

pcntl est l'abréviation de contrôle de processus. Habituellement, PHP. installera cette extension par défaut. Utilisez la fonction phpinfo() pour vérifier si l'extension existe.

Analyse de la programmation multi-processus PHP

Utilisez la fonction pcntl_fork() pour créer un processus enfant

La fonction de pcntl_fork est de créer un processus enfant identique au processus actuel . Le segment de code de ce processus enfant est exactement le même que le processus actuel, mais possède son propre segment de données. Regardons la manière la plus simple de créer un processus enfant :

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}
?>
pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。

Résultat de sortie :

Analyse de la programmation multi-processus PHP

Recyclage du sous-processus

① Méthode de blocage
Tu as eu du ps à l'instant ? Généralement, j'ai l'habitude d'utiliser la commande ps aux plus grep pour rechercher les processus en arrière-plan en cours d'exécution. Il y a une colonne STAT, qui identifie l'état d'exécution de chaque processus. Ici, nous nous concentrons sur l'état Z : Zombie. Lorsque le processus enfant se termine avant le processus parent et que celui-ci ne fait rien avec lui, le processus enfant deviendra un processus zombie. Bien que les processus zombies n’occupent pas beaucoup de mémoire, ils constituent une horreur. (N'oubliez pas qu'ils occupent toujours le PID)

De manière générale, recyclez simplement le processus enfant bloqué avant la fin du processus parent. Il existe une fonction pcntl_wait() dans l'extension pcntl. Cette méthode attend la fin du processus puis recycle le processus terminé.

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        pcntl_wait($status); // 子进程执行完后才执行父进程         print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}

② Mode non bloquant
Le mode bloquant perd le parallélisme de plusieurs processus. Il existe également un moyen de recycler le processus enfant terminé et de le paralléliser. C'est la méthode non bloquante.

<?php /**
 *  hedong
 * @date 2017-04-03
 */

for ($i = 1; $i <= 5; ++$i) {
    $pid = pcntl_fork(); // 创建子进程

    if (!$pid) {
        sleep(1);
        print "In child $i\n";
        exit($i);
    }
}

// pcntl_waitpid 第一个参数为 0 代表处理全部子进程

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    echo "Child $status completed\n";
}

Et si le processus parent meurt en premier ?

Que va-t-il se passer ? Rien ne se passe, le processus enfant est toujours en cours d'exécution. Mais à ce moment-là, le processus enfant sera confié au processus n°1, et le processus n°1 deviendra le beau-père de ces processus enfants. Le processus n°1 prendra bien soin des ressources de ces processus, et le processus n°1 récupérera automatiquement les ressources à leur fin. Ainsi, une autre façon temporaire de gérer les processus zombies consiste à arrêter leur processus parent.

Dernières choses à noter :

Le contrôle de processus ne peut pas être appliqué dans un environnement de serveur Web. Il peut entraîner des résultats inattendus lorsqu'il est utilisé dans un environnement de service Web. -- Extrait du manuel PHP

Référence :

http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing

http://www.jb51.net/article/71232.htm

http://www.laruence.com/2009/06/11/930.html

http://imhuchao.com/596.html

https://www.pureweber.com/article/php-multi-process-programming-preview/

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer