Inhaltsverzeichnis
In Bezug auf den ReusePort-Parameter wird es im offiziellen Workerman-Dokument so erklärt:
Worker-Klasse ist die wichtigste Klasse in Workerman. Es gibt eine listen()-Funktion:
Heim PHP-Framework Workerman Das Attribut reusePort in Workerman, das Sie kennen müssen

Das Attribut reusePort in Workerman, das Sie kennen müssen

Jul 23, 2021 pm 04:01 PM
workerman

Workerman ist ein Open-Source-Hochleistungs-Asynchron-PHP-Socket-Framework, das ausschließlich in PHP entwickelt wurde. Unterstützt lange TCP-Verbindungen und viele Protokolle wie Websocket und MQTT. Heute werden wir das reusePort-Attribut in Workerman einführen. Sie können bei Bedarf darauf verweisen.

Das Attribut reusePort in Workerman, das Sie kennen müssen

Workerman ist ein leistungsstarkes PHP-Socket-Server-Framework. Sie können Workerman verwenden, um direkt auf der TCP-Ebene zu programmieren. Die grundlegende Programmierroutine lautet:

$w = new Workerman\Worker('tcp://0.0.0.0:80');
$w->count = 4;
$w->onMessage = function(Workerman\COnnection\TcpConnection $connection, array $data) {
    $connection->send('Hello World');
};
Worker::runAll();
Nach dem Login kopieren

Ich frage mich, ob Ihnen der Parameter reusePort aufgefallen ist. Er ist standardmäßig auf false gesetzt. Wozu dient dieser Parameter? Unter welchen Umständen müssen wir es auf „true“ setzen, um die Leistung zu verbessern? 1. Die Rolle von Reuseport

In Bezug auf den ReusePort-Parameter wird es im offiziellen Workerman-Dokument so erklärt:

Nachdem die Wiederverwendung des Überwachungsports aktiviert ist, dürfen mehrere unabhängige Prozesse denselben Port und den Systemkernel überwachen Gleicht die Last aus, bestimmt, welcher Prozess die Socket-Verbindung zur Verarbeitung übergeben soll, vermeidet den donnernden Herdeneffekt und kann die Leistung von Kurzverbindungsanwendungen mit mehreren Prozessen verbessern.

Wenn Sie sich nicht eingehend mit der Linux-Netzwerkprogrammierung befasst haben, ist es schwierig, diesen Satz zu verstehen. Hier eine kurze Erklärung:

Das Serverprogramm empfängt normalerweise Clientanfragen, indem es eine bestimmte Portnummer auf dem Server abhört. Unter Linux werden die Netzwerkkarte des Servers und die Portnummer in einen

Socket

abstrahiert. Um die Leistung zu verbessern, verfügen allgemeine Serverprogramme über mehrere Prozesse (allgemein bekannt als

Worker

), die bei der Ausführung denselben Socket überwachen. Wenn keine Clientverbindung eintrifft, befinden sich diese Worker in einem angehaltenen Zustand und verbrauchen keine CPU-Ressourcen. Wenn zu einem bestimmten Zeitpunkt eine Client-Verbindung eintrifft, weckt der Linux-Kernel diese Worker gleichzeitig und lässt sie um die Verarbeitung der Verbindung konkurrieren.

Dadurch erhält nur ein Worker die Möglichkeit, die Verbindung zu verwalten , und die anderen Arbeiter werden nach dem Scheitern des Wettbewerbs in den suspendierten Zustand zurückkehren. Der Prozess des Aufweckens eines Workers verbraucht CPU-Ressourcen. Je größer die Anzahl der Worker, desto mehr CPU-Ressourcen werden verbraucht, was zu einer Ressourcenverschwendung führt. Dies wird oft als „Thundering Herd Effect“ bezeichnet.

Sie fragen sich vielleicht: Warum nicht jeweils einen Arbeiter aufwecken? Leider verfügt der Linux-Kernel nicht über eine solche Funktion. Glücklicherweise wurde die Reuseport-Funktion zu Linux 3.9 und späteren Versionen hinzugefügt. Wozu dient diese Funktion?

Vor Reuseport konnte eine Portnummer nur von einem Socket überwacht werden. Mit Reuseport wird diese Einschränkung aufgehoben: Eine Portnummer kann von mehreren Sockets gleichzeitig überwacht werden.

Wie bereits erwähnt, kann der Linux-Kernel nicht jeweils nur einen Worker aktivieren, aber der Kernel kann Client-Verbindungen gleichmäßig an eine Gruppe von Sockets senden, die denselben Port überwachen.

Wie in der Abbildung gezeigt, verfügt jeder Worker über einen eigenen Socket, der alle am selben Port lauscht. Wenn eine Client-Verbindung eintrifft, leitet der Kernel die Verbindung an einen Socket weiter, und dieser Socket weckt nur den Worker, zu dem er gehört. Dadurch wird der „Thundering Herd Effect“ geschickt gelöst und die Gesamtleistung verbessert.

Daraus können wir schließen: Wenn Ihre Linux-Kernelversion 3.9 und höher ist, können Sie bei Verwendung von Workerman reusePort auf true setzen, um die Effizienz der Programmausführung zu verbessern.

2. Wie Workerman reuseport verwendetObwohl Sie reusePort in Workerman nur auf

true

setzen müssen, können Sie diese erweiterte Funktion von Linux nutzen. Aber im Quellcode von Workerman ist es nicht nur so einfach, einen Kernel-Parameter zu aktivieren. Workerman verbirgt viele Designdetails für Sie, werfen wir einen Blick darauf.

Worker-Klasse ist die wichtigste Klasse in Workerman. Es gibt eine listen()-Funktion:

protected function listen()
{
    ...
    if (!$this->_mainSocket) {
        ...
        $this->_mainSocket = stream_socket_server(...);
        ...
    }
    ...
}
Nach dem Login kopieren

listen()-Funktion Einfach erstellen Erstellen Sie einen Socket im aktuellen Prozess und beginnen Sie, auf Anfragen zu warten. Wenn reusePort

false

ist, ruft der Hauptprozess die Funktion listen() auf, bevor er den Worker erstellt: Worker 类是 Workerman 里最主要的类,其中有个 listen() 函数:

protected function initWorkers() {
    ....
    if (!$worker->reusePort) {
        $worker->listen();
    }
    ....
}
Nach dem Login kopieren

listen() 函数的作用就是在当前进程创建一个 Socket 并开始监听请求。

当 reusePort 为 false 时,主进程在创建 Worker 之前就调用了 listen() 函数:

protected static function forkOneWorkerForLinux($worker) {
    ...
    $pid = pcntl_fork();
    if ($pid === 0) {
        if ($worker->reusePort) {
            $worker->listen();
        }
        ...
    }
    ...
}
Nach dem Login kopieren

随后主进程通过 pcntl_fork() 创建 Worker。pcntl_fork() 有个特性:创建出来的子进程(Worker)中的变量都是父进程复制而来的,包括父进程创建的 mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的mainSocket。所以,当reusePort为∗∗false∗∗时,所有的Worker都复制父进程的_mainSocket,也即共用一个 Socket。

而当 reusePort 为 true 时,情况就不同了。主进程在创建 Worker 前不会调用 listen(),而是在创建完 Worker 后由每个 Worker 自行发起 listen()

if ($this->reusePort) {
    $context = stream_context_create();
    stream_context_set_option($context, 'socket', 'so_reuseport', 1);
}
Nach dem Login kopieren
Nach dem Login kopieren

Dann erstellt der Hauptprozess den Worker über pcntl_fork(). pcntl_fork() verfügt über eine Funktion: Die Variablen im erstellten untergeordneten Prozess (Worker) werden vom übergeordneten Prozess kopiert, einschließlich des vom übergeordneten Prozess erstellten mainSocket. Wenn reusePort also **false** ist, kopieren alle Worker den mainSocket des übergeordneten Prozesses. Wenn reusePort also ∗∗false∗∗ ist, kopieren alle Worker den _mainSocket des übergeordneten Prozesses, d. h. sie teilen sich einen Socket.

Aber wenn reusePort

wahr

ist, ist die Situation anders. Der Hauptprozess ruft listen() nicht auf, bevor er einen Worker erstellt. Stattdessen initiiert jeder Worker nach dem Erstellen eines Workers einen listen()-Aufruf: 🎜rrreee🎜 Das Ergebnis ist, dass jeder untergeordnete Prozess (Worker) seinen eigenen Socket erstellt. 🎜🎜Eine letzte Sache: Wenn Sie möchten, dass der Kernel die Wiederverwendungsfunktion aktiviert, müssen Sie den Socket-Kontext manuell festlegen: 🎜
if ($this->reusePort) {
    $context = stream_context_create();
    stream_context_set_option($context, 'socket', 'so_reuseport', 1);
}
Nach dem Login kopieren
Nach dem Login kopieren

推荐学习:php视频教程

Das obige ist der detaillierte Inhalt vonDas Attribut reusePort in Workerman, das Sie kennen müssen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Implementieren Sie das Hoch- und Herunterladen von Dateien in Workerman-Dokumenten Implementieren Sie das Hoch- und Herunterladen von Dateien in Workerman-Dokumenten Nov 08, 2023 pm 06:02 PM

Um das Hochladen und Herunterladen von Dateien in Workerman-Dokumenten zu implementieren, sind spezifische Codebeispiele erforderlich. Einführung: Workerman ist ein leistungsstarkes PHP-Framework für die asynchrone Netzwerkkommunikation, das einfach, effizient und benutzerfreundlich ist. In der tatsächlichen Entwicklung sind das Hochladen und Herunterladen von Dateien häufige Funktionsanforderungen. In diesem Artikel wird erläutert, wie das Workerman-Framework zum Implementieren des Hochladens und Herunterladens von Dateien verwendet wird, und es werden spezifische Codebeispiele aufgeführt. 1. Datei-Upload: Unter Datei-Upload versteht man die Übertragung von Dateien vom lokalen Computer auf den Server. Folgendes wird verwendet

So implementieren Sie die grundlegende Verwendung von Workerman-Dokumenten So implementieren Sie die grundlegende Verwendung von Workerman-Dokumenten Nov 08, 2023 am 11:46 AM

Einführung in die Implementierung der grundlegenden Verwendung von Workerman-Dokumenten: Workerman ist ein leistungsstarkes PHP-Entwicklungsframework, mit dem Entwickler problemlos Netzwerkanwendungen mit hoher Parallelität erstellen können. In diesem Artikel wird die grundlegende Verwendung von Workerman vorgestellt, einschließlich Installation und Konfiguration, Erstellung von Diensten und Überwachungsports, Bearbeitung von Clientanfragen usw. Und geben Sie entsprechende Codebeispiele an. 1. Installieren und konfigurieren Sie Workerman. Geben Sie in der Befehlszeile den folgenden Befehl ein, um Workerman zu installieren: c

Was ist besser, Swoole oder Workerman? Was ist besser, Swoole oder Workerman? Apr 09, 2024 pm 07:00 PM

Swoole und Workerman sind beide leistungsstarke PHP-Server-Frameworks. Swoole ist für seine asynchrone Verarbeitung, hervorragende Leistung und Skalierbarkeit bekannt und eignet sich für Projekte, die eine große Anzahl gleichzeitiger Anfragen und einen hohen Durchsatz verarbeiten müssen. Workerman bietet die Flexibilität sowohl des asynchronen als auch des synchronen Modus mit einer intuitiven API, die sich besser für Benutzerfreundlichkeit und Projekte eignet, die ein geringeres Parallelitätsvolumen bewältigen.

Workerman-Entwicklung: So implementieren Sie Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Workerman-Entwicklung: So implementieren Sie Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Nov 08, 2023 am 08:03 AM

Workerman-Entwicklung: Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Zusammenfassung: In diesem Artikel wird erläutert, wie Sie mit dem Workerman-Framework eine Echtzeit-Videoanruffunktion basierend auf dem UDP-Protokoll implementieren. Wir werden ein tiefgreifendes Verständnis der Eigenschaften des UDP-Protokolls erlangen und anhand von Codebeispielen zeigen, wie man eine einfache, aber vollständige Echtzeit-Videoanrufanwendung erstellt. Einführung: In der Netzwerkkommunikation sind Echtzeit-Videoanrufe eine sehr wichtige Funktion. Beim herkömmlichen TCP-Protokoll kann es bei der Implementierung von Videoanrufen mit hoher Echtzeitgeschwindigkeit zu Problemen wie Übertragungsverzögerungen kommen. Und UDP

So erstellen Sie mit Workerman ein hochverfügbares Lastausgleichssystem So erstellen Sie mit Workerman ein hochverfügbares Lastausgleichssystem Nov 07, 2023 pm 01:16 PM

Für die Verwendung von Workerman zum Aufbau eines hochverfügbaren Lastausgleichssystems sind spezifische Codebeispiele erforderlich. Im Bereich der modernen Technologie müssen mit der rasanten Entwicklung des Internets immer mehr Websites und Anwendungen eine große Anzahl gleichzeitiger Anforderungen verarbeiten. Um eine hohe Verfügbarkeit und Leistung zu erreichen, ist das Lastausgleichssystem zu einer der wesentlichen Komponenten geworden. In diesem Artikel wird erläutert, wie Sie mit dem PHP-Open-Source-Framework Workerman ein Hochverfügbarkeits-Lastausgleichssystem erstellen und spezifische Codebeispiele bereitstellen. 1. Einführung in WorkermanWorke

So implementieren Sie die Timer-Funktion im Workerman-Dokument So implementieren Sie die Timer-Funktion im Workerman-Dokument Nov 08, 2023 pm 05:06 PM

So implementieren Sie die Timer-Funktion im Workerman-Dokument Workerman ist ein leistungsstarkes PHP-Framework für die asynchrone Netzwerkkommunikation, das eine Fülle von Funktionen bereitstellt, einschließlich der Timer-Funktion. Verwenden Sie Timer, um Code innerhalb bestimmter Zeitintervalle auszuführen. Dies eignet sich sehr gut für Anwendungsszenarien wie geplante Aufgaben und Abfragen. Als nächstes werde ich detailliert vorstellen, wie die Timer-Funktion in Workerman implementiert wird, und spezifische Codebeispiele bereitstellen. Schritt 1: Workerman installieren Zuerst müssen wir Worker installieren

So implementieren Sie die Reverse-Proxy-Funktion im Workerman-Dokument So implementieren Sie die Reverse-Proxy-Funktion im Workerman-Dokument Nov 08, 2023 pm 03:46 PM

Für die Implementierung der Reverse-Proxy-Funktion im Workerman-Dokument sind spezifische Codebeispiele erforderlich. Einführung: Workerman ist ein leistungsstarkes PHP-Framework für die Netzwerkkommunikation mit mehreren Prozessen, das umfangreiche Funktionen und leistungsstarke Leistung bietet und in der Web-Echtzeitkommunikation weit verbreitet ist Service-Szenarien. Unter anderem unterstützt Workerman auch die Reverse-Proxy-Funktion, mit der Lastausgleich und statisches Ressourcen-Caching realisiert werden können, wenn der Server externe Dienste bereitstellt. In diesem Artikel wird erläutert, wie Sie Workerman zum Implementieren der Reverse-Proxy-Funktion verwenden.

So implementieren Sie die TCP/UDP-Kommunikation in der Workerman-Dokumentation So implementieren Sie die TCP/UDP-Kommunikation in der Workerman-Dokumentation Nov 08, 2023 am 09:17 AM

Für die Implementierung der TCP/UDP-Kommunikation im Workerman-Dokument sind spezifische Codebeispiele erforderlich. Workerman ist ein leistungsstarkes asynchrones ereignisgesteuertes PHP-Framework, das häufig zur Implementierung der TCP- und UDP-Kommunikation verwendet wird. In diesem Artikel wird erläutert, wie Sie mit Workerman TCP- und UDP-basierte Kommunikation implementieren, und entsprechende Codebeispiele bereitstellen. 1. Erstellen Sie einen TCP-Server für die TCP-Kommunikation. Es ist sehr einfach, einen TCP-Server mit Workerman zu erstellen. Sie müssen nur den folgenden Code schreiben: <?ph

See all articles