Cet article présente principalement pcntl_fork sur le contrôle de processus pcntl de PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
PHP. la prise en charge du contrôle de processus implémente la création de processus de style Unix, l'exécution de programme, le traitement du signal et l'interruption de processus. Le contrôle de processus ne peut pas être utilisé dans un environnement de serveur Web et peut entraîner des résultats inattendus lorsqu'il est utilisé dans un environnement de serveur Web.
Ce document explique l'utilisation courante de chaque fonction de contrôle de processus. Pour plus d'informations sur le contrôle de processus Unix, il est recommandé de consulter la documentation système sur fork(2), waitpid(2), signal(2), etc. ou des documents de référence plus complets tels que "Programmation avancée dans un environnement Unix" ( auteur : W. Richard Stevens, Addison-Wesley).
PCNTL utilise désormais les ticks comme mécanisme de rappel pour le traitement du signal. La vitesse des ticks dépasse de loin le mécanisme de traitement précédent. Ce changement suit la même sémantique que les « ticks utilisateur ». Vous pouvez utiliser l'instruction declare() pour spécifier où les rappels sont autorisés à se produire dans votre programme. Cela nous permet de minimiser la surcharge liée à la gestion des événements asynchrones. L'activation de pcntl lors de la compilation de PHP entraînera toujours cette surcharge, que pcntl soit réellement utilisé dans votre script ou non.
Une modification est que tous les scripts pcntl antérieurs à PHP 4.3.0 pour le faire fonctionner, utilisent declare() dans la partie (du code) où les rappels devraient être autorisés, ou utilisent la nouvelle syntaxe globale de declare() pour le faire fonctionner Valable tout au long du script.
Remarque : Cette extension n'est pas disponible sur la plateforme Windows.
Document officiel pcntl
# 来源官方 PHP 4 >= 4.1.0, PHP 5, PHP 7) pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。 说明 int pcntl_fork ( void ) pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。 返回值 成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
<?php /** * Created by PhpStorm. * User: Object * Date: 2018/6/11 * Time: 10:12 */ const NEWLINE = "\n\n"; if (strtolower(php_sapi_name()) != 'cli') { die("请在cli模式下运行"); } echo "当前进程:" . getmypid() . NEWLINE; $pid = pcntl_fork(); //fork出子进程 //fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立 if ($pid == -1) { // 创建错误,返回-1 die('进程fork失败'); } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id // 父进程逻辑 $time = microtime(true); echo "我是父进程:{$time}".NEWLINE; } else { // $pid = 0 // 子进程逻辑 $time = microtime(true); echo "我是子进程:{$time}".NEWLINE; }
当前进程:17472 我是父进程:1528697500.2961 我是子进程:1528697500.2961
Ici, nous modifions l'ordre if des processus parent et enfant dans le code ci-dessus
if ($pid == -1) { // 创建错误,返回-1 die('进程fork失败'); } else if (!$pid) { // $pid = 0 // 子进程逻辑 $time = microtime(true); echo "我是子进程:{$time}".NEWLINE; } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id // 父进程逻辑 $time = microtime(true); echo "我是父进程:{$time}".NEWLINE; }
当前进程:17472 我是父进程:1528697500.2961 我是子进程:1528697500.2961
Fork exécutera d'abord la logique du processus parent, puis la logique du processus enfant
Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour en savoir plus. contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
PHP utilise la réflexion pour obtenir des classes et certaines applications de base
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!