Maison > développement back-end > Problème PHP > Comment activer le module pcntl et implémenter la programmation multi-processus en PHP ?

Comment activer le module pcntl et implémenter la programmation multi-processus en PHP ?

王林
Libérer: 2023-02-23 13:14:01
avant
4516 Les gens l'ont consulté

Vérifiez d'abord la version de PHP que j'ai installée :

PHP 7.3.7 (cli) (built: Jul 12 2019 22:25:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
Copier après la connexion

php doit installer le module pcntl pour implémenter le multi-processus. Ce module est officiellement fourni par php, nous avons donc besoin d'installer le module pcntl. pouvez l'utiliser en PHP Trouvé dans le code source, téléchargez le code source php7.3.7 et décompressez-le dans le répertoire /home À ce moment, l'extension pcntl dont nous avons besoin se trouve dans /home/php-7.3.7/ext/pcntl

. Exécutez les commandes suivantes dans l'ordre  :

phpize
./configure --with-php-config=/usr/local/bin/php-config
make & make install
Copier après la connexion

Ici, vous pouvez utiliser php-config pour déterminer le chemin du fichier find / -name php-config et enfin générer le fichier pcntl.so.

Recherchez ensuite le chemin où se trouve le fichier ini de php, vous pouvez utiliser la commande php --ini pour le visualiser

Quant au chemin du module d'extension php, vous pouvez l'utiliser php -i | grep extension_dir pour le visualiser, puis copiez le fichier so généré dans le chemin du module. Ensuite, ajoutez extension=pcntl au fichier php.ini

Utilisez php -m pour vérifier si le module est chargé ! À ce stade, le module pcntl est installé. Commençons à coder. La fonction

for ($i = 0; $i < 3; $i++){   
    $pid = pcntl_fork();
     if ($pid == -1) {
        die("开启进程失败");
    } elseif ($pid) { 
         echo "启动子进程 $pid \n";
    } else {
      echo "子进程 ".getmypid()." 正在处理任务\n";
      sleep(rand(5,10));
      exit;
    }
}

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    
    echo "子进程推出,状态码 $status \n";
}
Copier après la connexion

pcntl_fork() crée un processus enfant. En cas de succès, le PID du processus enfant généré est renvoyé dans le thread d'exécution du processus parent. Renvoie 0 à l'intérieur. En cas d'échec, -1 est renvoyé dans le contexte du processus parent, le processus enfant n'est pas créé et une erreur PHP est générée.

pcntl_waitpid() — Attendre ou renvoyer l'état du processus enfant de fork, suspendre l'exécution du processus en cours jusqu'à ce que le processus avec le numéro de processus spécifié par le paramètre pid se termine, ou recevoir un signal demandant d'interrompre le processus en cours ou appeler une fonction de gestionnaire de signal. La valeur renvoyée peut être -1, 0 ou >0. Si elle est -1, cela signifie que le processus enfant a une erreur. Si >0, cela signifie que le processus enfant s'est terminé et la valeur est le pid de la sortie. processus enfant. Quant à la façon de quitter, vous pouvez transmettre la réponse du code d'état $status

root@4226aaf8d937:/home/demo# php index.php 
启动子进程 150 
启动子进程 151 
启动子进程 152 
子进程 152 正在处理任务
子进程 151 正在处理任务
子进程 150 正在处理任务
子进程推出,状态码 0 
子进程推出,状态码 0 
子进程推出,状态码 0
Copier après la connexion
rrree

Comment gérer le cas où le processus enfant est tué de force à l'aide de l'identifiant de processus kill -9 ?

root@4226aaf8d937:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3   3976  3180 pts/0    Ss   04:42   0:00 bash
root        17  0.0  0.3   3868  3184 pts/1    Ss   04:48   0:00 bash
root       149  0.3  2.1  79740 21888 pts/0    S+   06:18   0:00 php index.php
root       150  0.0  0.6  79740  6664 pts/0    S+   06:18   0:00 php index.php
root       151  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       152  0.0  0.6  79740  6604 pts/0    S+   06:18   0:00 php index.php
root       153  0.0  0.2   7640  2660 pts/1    R+   06:18   0:00 ps -aux
Copier après la connexion

pcntl_wifexited— Vérifie si le code d'état représente une sortie normale

pcntl_wifsignaled — Vérifie si le code d'état du processus enfant représente une sortie normale Interrompu par un signal

pcntl_wtermsig — Renvoie le signal qui a provoqué l'interruption du processus enfant

On ouvre une des deux fenêtres :

Comment activer le module pcntl et implémenter la programmation multi-processus en PHP ?

Comment activer le module pcntl et implémenter la programmation multi-processus en PHP ?

Pour plus de contenu connexe, veuillez visiter le site Web PHP chinois : Tutoriel vidéo PHP

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal