Vorteile der Verwendung von Multiprozessen:
1. 使用多进程, 子进程结束以后, 内核会负责回收资源 2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Um Multiprozesse in PHP zu implementieren, los geht's.
Wir müssen installieren die pcnt-Erweiterung
pcntl Dies ist die Abkürzung für Prozesssteuerung. Normalerweise installiert PHP diese Erweiterung standardmäßig. Verwenden Sie die Funktion phpinfo(), um zu überprüfen, ob die Erweiterung vorhanden ist.
Verwenden Sie die Funktion pcntl_fork(), um einen untergeordneten Prozess zu erstellen.
Mit pcntl_fork wird ein untergeordneter Prozess erstellt, der mit dem aktuellen Prozess identisch ist. hat aber ein eigenes Datensegment. Schauen wir uns die einfachste Methode zum Erstellen eines Unterprozesses an:
<?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,它是父进程。
Ausgabeergebnisse:
Recycling von Unterprozessen
① Blockierungsmethode
Haben Sie gerade ps? Im Allgemeinen bin ich es gewohnt, den Befehl ps aux plus grep zu verwenden, um laufende Hintergrundprozesse zu finden. Es gibt eine Spalte STAT, die den laufenden Status jedes Prozesses angibt. Hier konzentrieren wir uns auf Zustand Z: Zombie. Wenn der untergeordnete Prozess vor dem übergeordneten Prozess beendet wird und der übergeordnete Prozess nichts damit macht, wird der untergeordnete Prozess zu einem Zombie-Prozess. Obwohl Zombie-Prozesse nicht viel Speicher beanspruchen, sind sie ein Dorn im Auge. (Vergessen Sie nicht, dass sie immer noch die PID belegen)
Im Allgemeinen recyceln Sie einfach den toten untergeordneten Prozess, bevor der übergeordnete Prozess endet. In der pcntl-Erweiterung gibt es eine Funktion pcntl_wait(). Diese Methode wartet auf das Ende des Prozesses und führt den beendeten Prozess dann erneut durch.
<?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; }
② Nicht blockierende Methode
Blockierende Methode verliert die Parallelität von Mehrprozessen. Es gibt auch eine Möglichkeit, den abgeschlossenen untergeordneten Prozess zu recyceln und zu parallelisieren. Dies ist der nicht blockierende Weg.
<?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"; }
Was passiert, wenn der übergeordnete Prozess zuerst stirbt?
Was wird passieren? Es passiert nichts, der untergeordnete Prozess läuft noch. Zu diesem Zeitpunkt wird der untergeordnete Prozess jedoch an Prozess Nr. 1 übergeben, und Prozess Nr. 1 wird zum Stiefvater dieser untergeordneten Prozesse. Prozess Nr. 1 kümmert sich sorgfältig um die Ressourcen dieser Prozesse und Prozess Nr. 1 fordert die Ressourcen automatisch zurück, wenn sie beendet sind. Eine weitere vorübergehende Möglichkeit, mit Zombie-Prozessen umzugehen, besteht darin, den übergeordneten Prozess herunterzufahren.
Abschließende Dinge, die Sie beachten sollten:
Die Prozesssteuerung kann nicht in einer Webserverumgebung angewendet werden. Wenn sie in einer Webdienstumgebung verwendet wird, kann es zu unerwarteten Ergebnissen kommen. – Auszug aus dem PHP-Handbuch
Referenz:
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/