Die folgende Spalte des Tutorials zur Workerman-Nutzung stellt Ihnen einige Konzepte vor, die Sie über Workerman wissen müssen. Ich hoffe, dass es für Freunde in Not hilfreich sein wird!
Workerman ist ein Open-Source-Hochleistungs-PHP-Socket-Service-Framework, das rein in PHP entwickelt wurde. Es handelt sich nicht um ein MVC-Framework, sondern um ein allgemeineres Socket-Service-Framework auf niedrigerer Ebene. Sie können es zum Entwickeln von TCP-Agenten, Ladder-Agenten, Spieleservern, Mailservern und FTP-Servern verwenden.
Empfohlen: Workerman-Tutorial
Tatsächlich ähnelt Workerman einer PHP-Version von Nginx, und der Kern besteht ebenfalls aus Multiprozess + Epoll + nicht blockierendem IO . Jeder Workerman-Prozess kann Zehntausende gleichzeitiger Verbindungen aufrechterhalten. Da es sich im Speicher befindet, ist es nicht auf Container wie Apache, Nginx und PHP-FPM angewiesen und verfügt über eine extrem hohe Leistung.
Unterstützt TCP, UDP, UNIXSOCKET, lange Verbindungen, Websocket, HTTP, WSS, HTTPS und andere Kommunikationsprotokolle sowie verschiedene benutzerdefinierte Protokolle. Es verfügt über viele leistungsstarke Komponenten wie Timer, asynchrone Socket-Clients, asynchrones MySQL, asynchrones Redis, asynchrones HTTP und asynchrone Nachrichtenwarteschlangen.
Zunächst müssen Sie einige Kernkonzepte verstehen: 1. Multiprozess 2. Epoll 3. Nicht blockierendes IO
1. Multiprozess:
Was ist ein Prozess? Ein Prozess umfasst Code, Daten und Ressourcen (Speicher), die dem Prozess zugewiesen sind. Intuitiv gesehen ist ein Prozess eine PID in einem Computersystem . Das Betriebssystem schützt den Prozessraum vor Störungen durch externe Prozesse, d. h. ein Prozess kann nicht auf den Speicher eines anderen Prozesses zugreifen.
Manchmal besteht die Notwendigkeit, zwischen Prozessen zu kommunizieren. In diesem Fall kann das Betriebssystem verwendet werden, um einen Mechanismus für die Kommunikation zwischen Prozessen bereitzustellen. Wenn Sie eine ausführbare Datei ausführen, erstellt das Betriebssystem normalerweise einen Prozess für die Ausführung.
Wenn die Ausführungsdatei jedoch auf einem Multiprozessdesign basiert, erstellt das Betriebssystem mehrere Prozesse auf dem ursprünglichen Prozess. Der zwischen diesen Prozessen ausgeführte Code ist derselbe, die Ausführungsergebnisse können jedoch gleich sein . Es kann anders sein.
Warum brauchen wir mehrere Prozesse? Die intuitivste Idee ist, dass, wenn das Betriebssystem Multi-Core unterstützt, eine ausführbare Datei auf verschiedenen Kernen ausgeführt werden kann, auch wenn sie kein Multi-Core ist, während ein Prozess auf E/A-Vorgänge wartet, ein anderer Der Prozess kann auch auf der CPU ausgeführt werden, um die CPU-Auslastung und die Programmeffizienz zu verbessern.
Auf Linux-Systemen können Sie fork() verwenden, um einen untergeordneten Prozess im übergeordneten Prozess zu erstellen. Nachdem ein Prozess fork() aufgerufen hat, weist das System dem neuen Prozess zunächst Ressourcen zu, z. B. Speicherdaten und Coderaum. Anschließend werden alle Werte und Status des ursprünglichen Prozesses in den neuen Prozess kopiert. Nur wenige Werte unterscheiden sich vom ursprünglichen Prozess, um verschiedene Prozesse zu unterscheiden.
Die Funktion fork() kehrt zweimal zurück, einmal zum übergeordneten Prozess (gibt die PID des untergeordneten Prozesses oder Informationen zum Fork-Fehler zurück) und einmal zum untergeordneten Prozess (gibt 0 zurück). Zu diesem Zeitpunkt trennten sich die Wege der beiden Prozesse und jeder wurde im System ausgeführt.
2. Nicht blockierendes IO:
Was ist IO, also der Betrieb von Eingabe und Ausgabe? Die Essenz von Netzwerk-E/A besteht darin, dass Sockets im Linux-System als Stream abstrahiert werden, und E/A kann als Konvektionsoperation verstanden werden. Bei einem IO-Zugriff (am Beispiel Lesen) werden die Daten zunächst in den Puffer des Betriebssystemkerns und dann aus dem Puffer des Betriebssystemkerns in den Adressraum des Anwendungsprogramms kopiert.
Wenn also ein Lesevorgang stattfindet, durchläuft er zwei Phasen:
Die erste Phase (Warten auf Daten): Warten darauf, dass die Daten bereit sind (Warten darauf, dass die Daten bereit sind bereit).
Die zweite Stufe (Kopieren von Daten): Kopieren der Daten vom Kernel in den Prozess (Kopieren der Daten vom Kernel in den Prozess)
Für Socket-Stream (d. h. IO),
Schritt 1: Normalerweise wird darauf gewartet, dass ein Datenpaket im Netzwerk ankommt und dann in einen Puffer im Kernel kopiert wird.
Schritt 2: Kopieren Sie die Daten aus dem Kernel-Puffer in den Anwendungsprozesspuffer.
Die Modelle von Netzwerk-IO sind ungefähr wie folgt:
Synchronous IO)
Blocking IO (Blocking IO) IO ) Ressource nicht verfügbar ist, wird die IO-Anfrage bis zum Rückmeldungsergebnis (Daten oder Timeout) blockiert. Unter Linux sind alle Sockets standardmäßig blockiert. Das Merkmal der Blockierung von E/A besteht darin, dass sie in beiden Phasen der E/A-Ausführung (Warten auf Daten und Kopieren von Daten) blockiert sind.
Wenn nicht blockierende IO-Ressourcen (nicht blockierende IO-Ressourcen) nicht verfügbar sind, wird die IO-Anfrage verlassen und zurückgegeben, und die Rückgabedaten zeigen an, dass die Ressource nicht verfügbar ist. Wenn die Daten unter Linux nicht bereit sind, wird der Benutzerprozess nicht blockiert, und der Kernel kehrt sofort zum Prozess zurück, was darauf hinweist, dass dieser Befehl nicht sofort ausgeführt werden kann (EAGAIN oder EWOULDBLOCK). Daher wird die Nichtblockierung durch Abfragen erreicht.
Multiplexing IO (Multiplexing IO) IO-Multiplexing nennen wir Select, Poll und Epoll. An manchen Stellen wird diese IO-Methode auch als ereignisgesteuertes IO bezeichnet. Der Vorteil von select/epoll besteht darin, dass ein einzelner Prozess die E/A mehrerer Netzwerkverbindungen gleichzeitig verarbeiten kann.
Das Grundprinzip besteht darin, dass die Select-, Poll- und Epoll-Funktionen kontinuierlich alle Sockets abfragen, für die sie verantwortlich sind. Wenn Daten in einem bestimmten Socket eintreffen, wird der Benutzerprozess benachrichtigt. Im IO-Multiplexing-Modell ist in der Praxis jeder Socket im Allgemeinen auf nicht blockierend eingestellt.
Der gesamte Benutzerprozess ist jedoch tatsächlich ständig blockiert. Es ist nur so, dass der Prozess durch die Auswahlfunktion und nicht durch Socket-E/A blockiert wird. Daher wird das E/A-Multiplexing bei Systemaufrufen wie select und epoll blockiert, nicht jedoch bei echten E/A-Systemaufrufen wie recvfrom.
Signalgesteuerte E/A (signalgesteuerte E/A)
Asynchrone E/A (asynchrone E/A) Nachdem der Benutzerprozess den Lesevorgang initiiert hat, kann er sofort mit anderen Aufgaben beginnen . Aus der Sicht des Kernels wird andererseits, wenn er einen asynchronen Lesevorgang empfängt, dieser sofort zurückgegeben, sodass keine Blockierung des Benutzerprozesses verursacht wird.
Dann wartet der Kernel auf den Abschluss der Datenvorbereitung und kopiert die Daten dann in den Benutzerspeicher. Wenn dies alles abgeschlossen ist, sendet der Kernel ein Signal an den Benutzerprozess, um ihm dies mitzuteilen Der Lesevorgang ist abgeschlossen.
3. Epoll ist jetzt eine verbesserte Abfrage, die vom Linux-Kernel erstellt wurde, um große Mengen von Dateideskriptoren zu verarbeiten Version der Schnittstelle Select/Poll, die die System-CPU-Auslastung des Programms erheblich verbessern kann, wenn nur eine kleine Anzahl aktiver Verbindungen unter einer großen Anzahl gleichzeitiger Verbindungen aktiv ist.
PS. Mehrere Punkte zu beachten: 1: Ist IO-Multiplexing ein synchrones Blockierungsmodell oder ein asynchrones Blockierungsmodell? Die Synchronisierung erfordert das aktive Warten auf Nachrichtenbenachrichtigungen, während die Asynchronität den passiven Empfang von Nachrichtenbenachrichtigungen und den passiven Erhalt von Nachrichten durch Rückrufe, Benachrichtigungen, Status usw. erfordert. Wenn das E/A-Multiplexing die Auswahlstufe blockiert, wartet der Benutzerprozess aktiv und ruft die Auswahlfunktion auf, um die Statusmeldung „Datenbereit“ zu erhalten, und sein Prozessstatus wird blockiert. Daher wird IO-Multiplexing als synchroner Blockierungsmodus klassifiziert. 2: Was genau ist Parallelität? Was ist der Zustand hoher Parallelität? Hochgradig gleichzeitige Programme verwenden im Allgemeinen die synchrone, nicht blockierende Methode anstelle der Multithreading + synchronen Blockierungsmethode. Um dies zu verstehen, schauen Sie sich zunächst den Unterschied zwischen Parallelität und Parallelität an. Das heißt, die Anzahl der Parallelität bezieht sich auf die Anzahl der gleichzeitig ausgeführten Aufgaben (z. B. gleichzeitig bediente HTTP-Anforderungen), während die Anzahl der Parallelität die Anzahl der physischen Ressourcen ist, die gleichzeitig arbeiten können ( (z. B. die Anzahl der CPU-Kerne). Durch die richtige Planung verschiedener Aufgabenphasen kann die Anzahl der Parallelitäten weitaus größer sein als der Grad der Parallelität. Dies ist das Geheimnis, warum einige CPUs Zehntausende gleichzeitiger Benutzeranforderungen unterstützen können. In dieser Situation mit hoher Parallelität ist die Erstellung eines Prozesses oder Threads für jede Aufgabe (Benutzeranforderung) sehr kostspielig. Die synchrone, nicht blockierende Methode kann mehrere E/A-Anfragen in den Hintergrund werfen, wodurch eine große Anzahl gleichzeitiger E/A-Anfragen in einem Prozess bearbeitet werden kann.Das obige ist der detaillierte Inhalt vonMehrere Konzepte, die Sie in Workerman kennen müssen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!