Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text)

Detaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text)

不言
不言Original
2018-09-13 17:11:021504Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Einführung (Bilder und Text) über den Multiprozess-Echo-Server. Ich hoffe, dass er für Sie hilfreich ist.

Das letzte Echo-Dienstprogramm weist einen großen Mangel auf, nämlich dass es nur eine Verbindung zu einem Client gleichzeitig herstellen kann, was offensichtlich unvernünftig ist.

Deshalb verwenden wir dieses Mal einen Multiprozessansatz, um Dienstleistungen für mehrere Kunden gleichzeitig bereitzustellen.

Das Folgende ist der endgültige Effekt:

Detaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text)

(Der von uns erstellte Arbeitsprozess kann über den Befehl ps angezeigt werden)

Detaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text)

(Öffnen Sie mehrere Terminals über xshell und verbinden Sie mehrere Clients mit dem Serviceprogramm)

Beginnen Sie vorher mit dem Codieren, Lassen Sie uns vorstellen, was ein Prozess ist.

Ein Prozess, also ein laufendes Programm, das Speicher belegt, ist ein unabhängiger Speicherplatz. Wenn wir beispielsweise die Notepad-Software unter Windows öffnen, entspricht dieser Vorgang dem Öffnen eines Prozesses.

Multiprozess bedeutet, mehrere Prozesse zu erstellen, um eine Sache gemeinsam abzuschließen.

Dieses Mal müssen wir nur das serverseitige Programm implementieren, und der Client kann weiterhin das vorherige verwenden. Wenn Sie die vorherigen Artikel nicht gelesen haben, können Sie sich die historischen Artikel ansehen.

In PHP können wir die Funktion pcntl_fork verwenden, um einen Prozess zu erstellen.

Das Folgende ist der Prototyp der Funktion:

int pcntl_fork ( void )

Offizielle Erklärung:

Bei Erfolg wird die PID des generierten untergeordneten Prozesses im Ausführungsthread des übergeordneten Prozesses zurückgegeben Prozess, und die PID des untergeordneten Prozesses wird im Ausführungsthread des untergeordneten Prozesses zurückgegeben. Gibt 0 zurück. Bei einem Fehler wird -1 im übergeordneten Prozesskontext zurückgegeben, der untergeordnete Prozess wird nicht erstellt und ein PHP-Fehler wird ausgelöst.

Warum wird es als Thread bezeichnet, der vom übergeordneten Prozess ausgeführt wird? Weil ein Prozess mindestens einen Thread enthält und dieser Thread der Hauptthread des Prozesses ist.

Wenn der übergeordnete Prozess pcntl_fork aufruft, kopiert er auch einen unabhängigen untergeordneten Prozess. Dieser untergeordnete Prozess hat denselben Kontext wie der übergeordnete Prozess. Mit anderen Worten: Die beiden Prozesse verwenden lediglich denselben Code.

Geben Sie den Codierungsprozess ein:

Detaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text)

Durch die Ausführung der Funktion pcntl_fork wird gleichzeitig ein untergeordneter Prozess kopiert Wenn der Kontext die Ausführungsumgebung des übergeordneten Prozesses ist, ist der Rückgabewert die Prozessnummer des untergeordneten Prozesses. Wenn es sich um die Ausführungsumgebung eines untergeordneten Prozesses handelt, wird 0 zurückgegeben. Daher werden in der folgenden Programmstruktur beide Zweige ausgeführt.

Der untergeordnete Prozess verfügt immer noch über die gleiche Logik wie zuvor und wird verwendet, um Nachrichten vom Client zu empfangen und sie gleichzeitig an den Client zu senden.

Die vorletzte Zeile ruft die Funktion pcntl_waitpid auf. Bevor wir diese Funktion erklären, wollen wir zunächst verstehen, was ein Zombie-Prozess ist.

Normalerweise wird der untergeordnete Prozess durch den übergeordneten Prozess erstellt. Da es sich bei Prozessen um unabhängige Speicherstrukturen handelt, kennt der übergeordnete Prozess den Ausführungsstatus des untergeordneten Prozesses nicht. Nachdem der untergeordnete Prozess seine Aufgabe abgeschlossen hat, kann er nicht mehr selbst beendet werden. Zu diesem Zeitpunkt muss der übergeordnete Prozess den Status des untergeordneten Prozesses über das Betriebssystem abrufen, um den untergeordneten Prozess wiederzuverwenden. Andernfalls wird unser untergeordneter Prozess zu einer Müllressource, also einem Zombie-Prozess.

Das Folgende ist der Funktionsprototyp dieser Funktion:

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )

Offizielle Erklärung:

Warten Sie auf den untergeordneten Prozessstatus von fork oder geben Sie ihn zurück.

Tatsächlich liegt ein Problem mit dem obigen Code vor. Nach dem ersten Aufruf von pcntl_waitpid in foreach ist der Hauptprozess zu diesem Zeitpunkt tatsächlich blockiert und wartet darauf, dass der erste untergeordnete Prozess beendet wird, während andere untergeordnete Prozesse beendet werden Prozesse Wenn es zu diesem Zeitpunkt abnormal beendet wird, wird es vom Hauptprozess nicht recycelt und es wird ein Zombie-Prozess generiert. In der tatsächlichen Entwicklung muss der Hauptprozess noch andere Dinge tun.

Daher wird hier die nicht blockierende Methode empfohlen. Sie ist sehr einfach. Fügen Sie einfach den dritten Parameter hinzu: WNOHANG. Das heißt: pcntl_waitpid ($pid, $status, WNOHANG)

Auf diese Weise kann es sofort zurückkehren, ohne dass der untergeordnete Prozess beendet wird, und somit weiterhin nachfolgenden Code ausführen.

Verwandte Empfehlungen:

Serverseitige PHP-Multiprozess-Programmierpraxis

Serverseitige PHP-Multiprozessprogrammierung practice_PHP-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung des Multiprozess-Echoservers in die PHPSocket-Programmierung (Bild und Text). 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