Heim  >  Artikel  >  PHP-Framework  >  Kurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine

Kurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine

coldplay.xixi
coldplay.xixinach vorne
2021-03-12 11:01:181934Durchsuche

Kurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine

In den letzten sechs Monaten habe ich ein Gameserver-Projekt mit PHP- und Java-Technologie-Stacks abgeschlossen. Da es im Projekt hochfrequente Netzwerkanforderungen gibt, versuchte der PHP-Technologie-Stack, die Swoole-Engine (eine leistungsstarke ereignisbasierte asynchrone parallele Netzwerkkommunikations-Engine) zu verwenden, um einen Teil des Spielegeschäfts abzuschließen.

Empfohlen (kostenlos): swoole

Swoole-Installation

Die Installation von swoole ist sehr einfach. Da es sich um ein Projekt von Chinesen handelt, können viele Fragen in den offiziellen Website-Dokumenten beantwortet werden. Es gibt zwei Arten der Installation:

  • Kompilieren und Installieren. Gehen Sie direkt zu Github oder Gitee, um die offizielle Release-Version herunterzuladen. Schreiben Sie nach dem Kompilieren und Installieren die SO-Erweiterung in die Datei php.ini.
  • Containerinstallation. Der Swoole-Motor ist weit verbreitet, daher stehen am Hub viele Behälter zur Verfügung. Wählen Sie einfach den gewünschten aus und ziehen Sie ihn.

Klicken Sie einfach auf Baidu, um spezifische Anweisungen zu erhalten. Es gibt viele verwandte Inhalte online.

Vorteile der Swoole-Engine

  1. Residenter Speicher. In herkömmlichen PHP-Frameworks oder einzelnen Dateien müssen vor der Verarbeitung jeder Anforderung die Vorgänge zum Laden der Framework-Datei und zur Konfiguration durchgeführt werden. Nach Abschluss der Anforderung werden alle Ressourcen und der Speicher freigegeben, sodass kein Grund zur Sorge über Speicherverluste besteht . Wenn jedoch die Anzahl der Anfragen zunimmt und die Parallelität hoch ist, werden Ressourcen schnell erstellt und sofort freigegeben, was dazu führt, dass die Betriebseffizienz des PHP-Programms stark abnimmt. Bei der Verwendung von Swoole besteht dieses Problem nicht: Nachdem der PHP-Code in den Speicher geladen wurde, hat er einen längeren Lebenszyklus, sodass die Datenbankverbindung und andere auf diese Weise hergestellte große Objekte nicht freigegeben werden. Jede Anfrage muss nur eine kleine Menge Code verarbeiten. Dieser Code wird nur vom PHP-Parser kompiliert und befindet sich bei der ersten Ausführung im Speicher. Zukünftig wird OPCODE direkt geladen, um die Zend-Engine direkt laufen zu lassen. Darüber hinaus können Dinge, die PHP zuvor nicht implementieren konnte, wie z. B. Datenbankverbindungspools und Cache-Verbindungspools, unter der Swoole-Engine implementiert werden. Die Betriebseffizienz des Systems wird erheblich verbessert.
  2. Schnelle Entwicklung. Die Swoole-Engine bietet einen asynchronen Multithread-Server in PHP-Sprache, einen asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, asynchrones Redis, einen Datenbankverbindungspool, AsyncTask, eine Nachrichtenwarteschlange, einen Millisekunden-Timer, asynchrones Lesen und Schreiben von Dateien sowie eine asynchrone DNS-Abfrage. Swoole verfügt über einen integrierten HTTP/WebSocket-Server/Client und einen HTTP2.0-Server.
  3. Coroutine-Programmiermodell. Swoole4 kann asynchrone Programme mit vollständig synchronem Code implementieren. Es ist nicht erforderlich, dem PHP-Code zusätzliche Schlüsselwörter hinzuzufügen. Die unterste Ebene führt automatisch eine Coroutine-Planung durch, um asynchrone E/A zu implementieren.

Swoole-Motorprozessanalyse

Das Flussdiagramm des Swoole-Betriebs lautet wie folgt:

Kurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine

Der Thread oder Prozess in Swoole

Das Strukturdiagramm lautet wie folgt:

Kurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine

Wolle Die Engine ist in zwei Typen unterteilt: Single-Threaded-Modus und Prozessmodus. In diesem Artikel wird nur der Prozessmodus behandelt. Der spezifische Unterschied zwischen den beiden wird in der offiziellen Dokumentation erläutert.

Master-Prozess

wird verwendet, um Swoole-Kernereignisse zu verarbeiten, wie z. B. Verbindungen von Clients und lokale Kommunikationsleitungen. Es gibt mehrere Threads im Masterprozess und jeder Thread führt eine Instanz der Epol-Funktion aus. (Da der Worker-Prozess nicht vom Master-Prozess gespalten wird, kann der Worker-Prozess nach dem gewaltsamen Beenden des Master-Prozesses noch vorhanden sein.)

Reaktor-Thread

Swooles Hauptprozess ist ein Multithread-Programm. Es gibt eine sehr wichtige Gruppe von Threads, die als Reaktor-Threads bezeichnet werden. Es ist der Thread, der tatsächlich TCP-Verbindungen verarbeitet und Daten sendet und empfängt.
Nach dem Akzeptieren einer neuen Verbindung weist der Hauptthread von Swoole die Verbindung einem festen Reactor-Thread zu, und dieser Thread ist für die Überwachung des Sockets verantwortlich. Lesen Sie die Daten, wenn der Socket lesbar ist, führen Sie eine Protokollanalyse durch und übermitteln Sie die Anfrage an den Worker-Prozess. Wenn der Socket beschreibbar ist, werden die Daten an den TCP-Client gesendet

Manager-Prozess

Die Worker-/Aufgabenprozesse in swoole werden alle vom Manager-Prozess geforkt und verwaltet.
Wenn der untergeordnete Prozess endet, ist der Managerprozess dafür verantwortlich, den untergeordneten Prozess wiederzuverwenden, um zu verhindern, dass er zu einem Zombie-Prozess wird. Und erstellen Sie neue untergeordnete Prozesse.
Wenn der Server heruntergefahren wird, sendet der Managerprozess Signale an alle untergeordneten Prozesse, um die untergeordneten Prozesse zu benachrichtigen, den Dienst zu schließen.
Wenn der Server neu geladen wird, schließt/startet der Managerprozess den untergeordneten Prozess neu durch einen

Worker-Prozess

Swoole bietet einen perfekten Prozessverwaltungsmechanismus, wenn der Worker-Prozess abnormal beendet wird, z. B. bei einem schwerwiegenden PHP-Fehler, wenn er versehentlich von anderen Programmen beendet wird oder nach Erreichen der max_request-Nummer normal beendet wird. Der Hauptprozess startet den neuen Worker-Prozess neu. Code kann im Worker-Prozess wie gewöhnliches Apache+PHP oder PHP-FPM geschrieben werden. Es besteht keine Notwendigkeit, asynchronen Callback-Code wie Node.js zu schreiben.

Rückruffunktion in jedem Prozess

Rückruffunktion im Master:

  • onStart
  • onShutdown

Rückruffunktion im Worker-Prozess

  • onWorkerStart
  • onWorkerStop
  • onConnect
  • onClose
  • onReceive
  • onFinish

Callback-Funktion innerhalb des TaskWorker-Prozesses

  • onTask
  • onWorkerStart

Callback-Funktion im Manager-Prozess

  • onManagerStart
  • onManagerStop

Die Beziehung zwischen Reactor, Worker und TaskWorker

kann als Reactor verstanden werden Ginx und Worker ist PHP -fpm. Der Reactor-Thread verarbeitet Netzwerkanfragen asynchron und parallel und leitet sie dann zur Verarbeitung an den Worker-Prozess weiter. Reaktor und Worker kommunizieren über UnixSocket.
In PHP-FPM-Anwendungen wird eine Aufgabe oft asynchron an eine Warteschlange wie Redis übermittelt und einige PHP-Prozesse werden im Hintergrund gestartet, um diese Aufgaben asynchron zu verarbeiten. Der von Swoole bereitgestellte TaskWorker ist eine umfassendere Lösung, die die Verwaltung von Aufgabenzustellung, Warteschlange und PHP-Aufgabenverarbeitungsprozessen integriert. Die asynchrone Aufgabenverarbeitung kann sehr einfach über die von der zugrunde liegenden Schicht bereitgestellte API implementiert werden. Darüber hinaus kann TaskWorker auch nach Abschluss der Aufgabenausführung ein Ergebnis an den Worker zurückgeben.
Swooles Reactor, Worker und TaskWorker können eng integriert werden, um erweiterte Nutzungsmethoden bereitzustellen. Eine beliebtere Metapher: Nehmen Sie an, dass der Swoole-Anwendungsserver eine Fabrik ist und der Reaktor ein Vertrieb ist, der Kundenaufträge entgegennimmt. Der Arbeiter ist der Arbeiter. Wenn der Verkäufer die Bestellung erhält, macht sich der Arbeiter an die Arbeit, um das zu produzieren, was der Kunde will. Der TaskWorker kann als Verwaltungspersonal verstanden werden, das dem Arbeiter bei der Erledigung einiger Aufgaben helfen kann, damit sich der Arbeiter auf die Arbeit konzentrieren kann.
Die unterste Ebene weist dem Worker-Prozess und dem TaskWorker-Prozess eine eindeutige ID zu. Verschiedene Worker- und TaskWorker-Prozesse können über die sendMessage-Schnittstelle kommunizieren.

Die Arbeitsteilung jedes Prozess-Threads im eigentlichen Projekt:

  • Manager-Prozess: Verantwortlich für die Verwaltung von Worker-Prozessen, Erstellung oder Recycling
  • Worker-Prozess: Spiellogikverarbeitung
  • taskWorker-Prozess: Senden von Netzwerkpaketen an den Client, der eine langfristige inaktive TCP-Verbindung schließt Ich habe versucht, den Geschäftscode anzupassen. Allerdings ist die Abwärtskompatibilität von Swoole sehr bewundernswert. Dabei wurde nur ein Code-Inkompatibilitätsproblem entdeckt: In der Originalversion wurde dieser mit Devil-Nummern konfiguriert, in der neuen Version jedoch Nummer war nicht makrodefiniert. Später habe ich die Makrodefinitionsgruppe durch einen Blick auf den Swoole-Quellcode gefunden und dann diese Konfiguration geändert. (Das Smooth-Versions-Upgrade basiert jedoch auch auf relativ wenigen Swoole-basierten Geschäftscodes und dient daher nur als Referenz

Weitere verwandte Lernempfehlungen: Swoole-Tutorial

Das obige ist der detaillierte Inhalt vonKurze Einführung in die Vermittlung der Prinzipien der Swoole-Engine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen