Heim > Artikel > Backend-Entwicklung > Detaillierte Einführung in pcntl_fork im PHP-Multiprozess
Dieser Artikel stellt hauptsächlich relevante Informationen zum detaillierten Beispiel von pcntl_fork vor, das von PHP Multi-Process kompiliert wurde. Ich hoffe, dass dieser Artikel jedem helfen kann, diesen Teil des Inhalts zu verstehen und zu beherrschen
Detaillierte Erläuterung des Beispiels von pcntl_fork in der PHP-Multiprozessprogrammierung
Tatsächlich unterstützt PHP Parallelität, wird jedoch selten verwendet. Die am häufigsten verwendete Methode sollte die Verwendung von PHP-FMP zur Planung des PHP-Prozesses sein.
Der Einsatz von PHP ist jedoch nicht auf das Web beschränkt. Wir können PHP auch für die Programmierung, Überwachung oder den Betrieb und die Wartung von Systemtools verwenden. Wenn wir diese Anweisungen verwenden, können wir weitere Funktionen von PHP nutzen, wie z. B. Parallelität (Mehrprozess), Socket-Programmierung usw.
Dann lasst uns über die PHP-Multiprozessprogrammierung sprechen, die mir begegnet ist. Es gibt einen Hintergrund für die Verwendung dieses Multiprozesses. Der Hintergrund wird im Folgenden vage beschrieben.
Ich brauche natürlich ein Überwachungssystem. Das Überwachungssystem muss viele Arten von Systemindikatoren überwachen, damit sich jeder Überwachungsindikator auf seine eigene Aufgabe konzentrieren kann Um einen Indikator zu überwachen, gibt es auch einen Prozess zum Lesen der Konfiguration. Starten Sie nach dem Abrufen der Konfiguration jeden Prozess entsprechend der Konfiguration.
Dann erfordert dies das, was ich Multiprozess nenne.
Starten Sie zunächst einen Hauptprozess, der zum Auslesen von Konfigurationsinformationen verwendet wird. Ich habe zum Beispiel gelesen, dass ich 5 Indikatoren überwachen muss
Dann startet der Hauptprozess 5 Unterprozesse, um jeweils diese 5 Indikatoren zu überwachen.
Nachdem 5 Indikatorüberwachungsprozesse erstellt wurden, führt der Hauptprozess die Überwachungskonfiguration durch.
Sobald sich die Konfiguration ändert, beenden Sie den vorherigen Prozess und erstellen Sie den Prozess neu.
Relativ klare Logik. Dann vereinfachen wir den Vorgang: Einfach ausgedrückt erstellt ein Hauptprozess 5 Unterprozesse.
Um einen Prozess zu erstellen, müssen Sie zunächst eine Funktion pcntl_fork() in PHP verwenden. Einige Schüler sind möglicherweise nicht mit dieser Funktion vertraut, aber jeder, der mit der Linux-C-Programmierung vertraut ist, weiß das ist eine Funktion namens fork() unter Linux, die zum Erstellen untergeordneter Prozesse verwendet wird. Diese Funktion hat die gleiche Bedeutung wie diese Funktion unter Linux. Es ist zu beachten, dass diese Funktion nur unter Linux genutzt werden kann und die Erweiterung pcntl installiert werden muss.
Informationen zur Verwendung dieser Funktion finden Sie im offiziellen Dokument: http://php.net/manual/zh/function.pcntl-fork.php
Das offizielle Dokument Das Dokument sieht folgendermaßen aus:
Die Funktion pcntl_fork() erstellt einen untergeordneten Prozess. Dieser untergeordnete Prozess unterscheidet sich von seinem übergeordneten Prozess nur in der PID (Prozessnummer) und der PPID (übergeordnete Prozessnummer). Einzelheiten zur Funktionsweise von Fork auf Ihrem System finden Sie im Fork(2)-Handbuch Ihres Systems.
Bei Erfolg wird die PID des generierten untergeordneten Prozesses im Ausführungsthread des übergeordneten Prozesses und 0 im Ausführungsthread des untergeordneten Prozesses zurückgegeben. Bei einem Fehler wird -1 im übergeordneten Prozesskontext zurückgegeben, der untergeordnete Prozess wird nicht erstellt und ein PHP-Fehler wird ausgelöst.
Auf diese Weise kann ein untergeordneter Prozess erstellt werden. Nachdem der untergeordnete Prozess erfolgreich erstellt wurde, wird die Methode nach pcntl_fork() ausgeführt. Wie verstehen wir also den Rückgabewert dieser Funktion?
Dies ist der Fall. Wenn wir eine Funktion aufrufen, um einen Prozess zu erstellen, gibt es Zeit, in der die Funktion ausgeführt wird, und der neue Prozess wird genau zwischen dem Start und dem Ende der Funktionsausführung erstellt , der neue Prozess wird ebenfalls ausgeführt, daher muss die Funktion auch einen Rückgabewert haben. Nachdem die Funktion einmal ausgeführt wurde, erhalten sowohl der übergeordnete Prozess als auch der untergeordnete Prozess den Rückgabewert der Funktion. Da der übergeordnete Prozess den untergeordneten Prozess erstellt, der untergeordnete Prozess jedoch keinen neuen Prozess erstellt, hat der untergeordnete Prozess keinen Rückgabeergebnis dieser Funktion, daher wurde ihm eine 0 zugewiesen. Der übergeordnete Prozess erstellt einen untergeordneten Prozess, und der untergeordnete Prozess verfügt über eine PID, sodass die PID dieses Prozesses ermittelt wird.
Wir können ein Programm schreiben, um Folgendes herauszufinden:
$pid = pcntl_fork(); var_dump($pid);
Dieser Aufruf gibt zwei Werte aus, aber wenn wir ihn direkt drucken, können wir nur siehe Ein Wert ist die PID des untergeordneten Prozesses, aber mit var_dump können wir zwei Werte sehen, nämlich 0 und die PID des untergeordneten Prozesses. Der Wert 0 wird vom Kindprozess zurückgegeben.
Nachdem wir verstanden haben, wie ein Prozess erstellt wird, können wir mit der Erstellung von Prozessen beginnen. Wir müssen 5 Prozesse erstellen, also werde ich 5 Schleifen erstellen, um Prozesse zu erstellen. Holen Sie sich den folgenden Code:
$i=0; while($i!=5){ $pid = pcntl_fork(); echo $pid."---------hahah".$i++.PHP_EOL; }
Das ist es. Ah? Ich habe festgestellt, dass es keine 5 Prozesse gab. Ich habe festgestellt, dass es viele Prozesse gab und die letzte Ausgabe von hahah4 32 war. Warum war es 32? Lass uns rechnen. 2^5=32, warum ist die endgültige Anzahl der Threads exponentiell gestiegen?
Es ist nicht schwer, dies zu finden, da jeder weitere von uns eine While-Schleife ausführt und es am Ende zu einem exponentiellen Wachstum des Prozesses kommt – das heißt, die While-Schleife wird ebenfalls eingeführt beim Gabeln. Aber wir brauchen nur 5 Prozesse. Was zu tun?
Aus der vorherigen Untersuchung der Funktion können wir ersehen, dass der untergeordnete Prozess einen Wert von 0 zurückgibt, sodass wir wissen können, dass 0 die Markierung des untergeordneten Prozesses ist. Wir können die Prozessausführung beenden, indem wir den untergeordneten Prozess markieren. Daher können wir unseren Code in die folgende Form ändern:
$i=0; while($i!=5){ $pid = pcntl_fork(); echo $pid."---------hahah".$i++.PHP_EOL; if ($pid == 0) { echo "子进程".PHP_EOL; return; } }
因为0其实是对子进程的标记,那么pid这个变量在子进程里实际上是0的,所以当发现pid的值为0的时候,我们就可以断定我们当前进程为一个子进程,不需要在让他执行while并创建子进程的子进程了,所以在执行完我们的内容之后就return或者exit退出这个执行就好了。这样就能保证我们执行创建了5个进程而不是32个了。
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in pcntl_fork im PHP-Multiprozess. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!