Maison >développement back-end >Problème PHP >Comment activer le module pcntl et implémenter la programmation multi-processus en PHP ?
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
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
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"; }
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 子进程推出,状态码 0rrree
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
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 :
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!