Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der Lösung des Zombie-Prozessproblems in PHP-Multiprozessen

Detaillierte Erklärung der Lösung des Zombie-Prozessproblems in PHP-Multiprozessen

黄舟
黄舟Original
2017-10-16 09:11:451801Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen zum Verständnis des Zombie-Prozessproblems in der PHP-Multiprozessprogrammierung vor. Ich hoffe, dass dieser Artikel jedem helfen kann, diesen Teil des Inhalts zu meistern

Verständnis des Zombie-Prozessproblems in der PHP-Multiprozessprogrammierung

Mit der Funktion pcntl_fork kann PHP den Effekt der Parallelität mehrerer Prozesse oder der asynchronen Verarbeitung erzielen: http:/ /www.jb51.net/article/ 125789.htm

Dann besteht das Problem darin, dass der von uns erzeugte Prozess kontrolliert werden muss und nicht ignoriert werden kann. Der einfachste Weg besteht darin, den Prozess zu forken und zu beenden.

Durch die Verwendung der Funktion pcntl_fork haben wir bereits einen neuen Unterprozess, und der Unterprozess wird dann das abschließen, was wir verarbeiten müssen, also nennen wir ihn vorerst service(), und wir brauchen Viele service() Beziehen Sie sich zur Verarbeitung erneut auf unsere vorherigen Anforderungen. Der übergeordnete Prozess muss die Konfigurationsdatei in einer Schleife lesen und warten, bis sich die Datei ändert. Mit pcntl_fork können wir ganz einfach den folgenden Code schreiben:


$res = config();
//kill进程
for($i = 0; $i < $res[sum]; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
    service();
    return;
  }
}

Wir müssen die kommentierten Bereiche im Code löschen, wenn Änderungen in der Konfigurationsdatei vorgenommen werden . Der Weg, einen Prozess zu beenden, ist sehr einfach. Sie können ihn beispielsweise direkt mit dem Befehl kill beenden (vorausgesetzt, die PID ist 123):


1 kill 123

Wir haben jedoch festgestellt, dass die Verwendung dieser Methode zum Beenden des Prozesses den Prozess nicht tatsächlich beendet, sondern immer noch die Ressourcen dieses Prozesses belegt. Wir werden zu einem Zombie-Prozess, der nicht mit dem Kill-Befehl beendet werden kann . Es gibt nur zwei Möglichkeiten, dieses Problem zu lösen.

1. Herunterfahren

2. Beenden Sie den übergeordneten Prozess dieses Prozesses.

Aber keine dieser Methoden funktioniert, da der Zweck dieses Programms darin besteht, den Server zu überwachen und sich auf ihm zu befinden. Der Server kann nicht heruntergefahren werden und der übergeordnete Prozess kann nicht beendet werden. Zu diesem Zeitpunkt haben wir die Erklärung der Fork-Methode im offiziellen Dokument gesehen:


pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。

Es stellt sich heraus, dass es eine Möglichkeit gibt, zu verhindern, dass der Prozess zu einem Zombie-Prozess wird. aber der auf der offiziellen Website angegebene Code lautet: Er sieht so aus:


$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
  //错误处理:创建子进程失败时返回-1.
   die(&#39;could not fork&#39;);
} else if ($pid) {
   //父进程会得到子进程号,所以这里是父进程执行的逻辑
   pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
   //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

Was bedeutet das? Das heißt, der übergeordnete Prozess wartet auf die Ausführung des untergeordneten Prozesses. Nachdem die Ausführung des untergeordneten Prozesses abgeschlossen ist, fährt er mit dem nächsten Schritt fort und der Zombie-Prozess wird ebenfalls eliminiert. Dies entspricht jedoch nicht unseren Anforderungen. Unser Unterprozess ist ein Endlosschleifenprogramm, das ständig nach Ausgaben sucht. Die Aktualisierung ist noch nicht abgeschlossen. Wir benötigen eine asynchrone Verarbeitung und keine Synchronisierung. Aber kann diese Methode angewendet werden? Eigentlich kannst du das natürlich.

Diese Funktion wird in der pcntl_wait-Dokumentation erklärt:

Die Wartefunktion unterbricht die Ausführung des aktuellen Prozesses, bis ein untergeordneter Prozess beendet wird oder ein Signal empfängt, das dazu auffordert, den aktuellen Prozess zu unterbrechen oder ein Signal aufzurufen Verarbeitungsfunktion. Wenn beim Aufruf dieser Funktion ein untergeordneter Prozess beendet wurde (allgemein als Zombie-Prozess bekannt), kehrt diese Funktion sofort zurück. Alle vom untergeordneten Prozess verwendeten Systemressourcen werden freigegeben. Detaillierte Spezifikationen zur Funktionsweise von Wait auf Ihrem System finden Sie im Wait(2)-Handbuch Ihres Systems.

Wir haben festgestellt, dass diese Funktion, wenn sie feststellt, dass der untergeordnete Prozess zu einem Zombie-Prozess geworden ist, die Ressourcen des Zombie-Prozesses freigibt – vorausgesetzt, der Zombie-Prozess ist ein untergeordneter Prozess des übergeordneten Prozesses. Dann können wir diese Methode geschickt nutzen, um diese Zombie-Prozesse Ressourcen freigeben zu lassen, sodass wir den folgenden Code haben:


 posix_kill(123, 9);
 pcntl_wait($status);

Auf diese Weise verwenden wir zunächst Kill, um zu töten Dieser Prozess wird nicht mehr ausgeführt, aber dieser Prozess ist zu einem Zombie-Prozess geworden, der Ressourcen belegt. Im nächsten Satz werden wir pcntl_wait() ausführen, damit diese Zombie-Prozesse tatsächlich Ressourcen freigeben beendet, und der Zombie-Prozess wird eliminiert.

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Lösung des Zombie-Prozessproblems in PHP-Multiprozessen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn