Detaillierte Erläuterung des Startvorgangs der Workerman-Quellcode-Analyse

Freigeben: 2019-11-26 14:26:33
nach vorne
3572 Leute haben es durchsucht

In der folgenden Kolumne wird der Startprozess der Workerman-Quellcode-Analyse aus der KolumneWorkerman-Tutorialvorgestellt. Ich hoffe, dass es für Freunde in Not hilfreich sein wird!

Detaillierte Erläuterung des Startvorgangs der Workerman-Quellcode-Analyse

Arbeiter

Version: 3.1.8 (Linux)

Modell: GatewayWorker (das Worker-Modell kann damit verglichen werden)

Hinweis: Es werden nur der erklärende Teil des Codes und die Quelle veröffentlicht wird in Form eines Dateinamens angegeben. Sie können es selbst ausprobieren

Workerman hat zunächst nur die Linux-Version entwickelt, Win wurde später hinzugefügt und läuft im Befehlszeilenmodus (CLI).

Multiprozessmodell

Worker-Prozess, Master, Gateway und Worker werden hauptsächlich zum Verarbeiten von E/A-Ereignissen und zum Speichern des Client-Link-Status verwendet Das Senden von Datenverarbeitungsanfragen an Worker und andere Aufgaben ist eine IO-intensive Verarbeitung, und letztere ist eine rechenintensive Kommunikation über das Netzwerk ist für die verteilte Bereitstellung sehr praktisch. Wenn das Geschäftsverarbeitungsvolumen groß ist, können Sie einfach Worker-Dienste hinzufügen.

Detaillierte Erläuterung des Startvorgangs der Workerman-Quellcode-Analyse

Sie verfügen über einen übergeordneten Prozess (Master), der für die Überwachung verantwortlich ist, den Status des untergeordneten Prozesses überwacht, Signale an den untergeordneten Prozess sendet und Befehle und Signale vom Terminal akzeptiert . Man kann sagen, dass der übergeordnete Prozess der Einstiegspunkt ist, nachdem das gesamte System gestartet wurde.

Befehlsanalyse starten

Da es im Befehlsmodus (cli) ausgeführt wird (beachten Sie den Unterschied zu fpm), verarbeitet letzteres Anfragen von Webseite) muss ein Startskript-Parsing-Befehl vorhanden sein. Version 3.x (zuvor war der Standardwert daemon) fügt einen -d-Parameter hinzu, um anzuzeigen, dass der Daemon-Prozess ausgeführt wird. Legen Sie nach dem Parsen dieses Parameters self: fest. $daemon = true und dann fork Der untergeordnete Prozess kann die aktuelle Prozessgruppe verlassen, den Prozessgruppenleiter festlegen usw.

Es gibt zwei sehr wichtige Parameter $argc und $argc. Der erste stellt die Anzahl der Parameter dar und der zweite ist ein Array, das alle Parameter des Befehls speichert, wie zum Beispiel: sudo php start.php start -d, $argv ist ein Array ([0]=>start.php, [1]=>start, [2]=>-d), und beim Parsen wird hauptsächlich $argv verwendet.

Der Startup führt hauptsächlich die folgenden Schritte aus:

1. Enthält den automatischen Lader Autoloader, um die Startdateien unter jeder Anwendung zu laden.

2.

3. Parameter analysieren, initialisieren und entsprechende Befehle ausführen.

Das Folgende ist die spezifische Implementierung (workerman/worker.php):

public static function parseCommand() { // 检查运行命令的参数 global $argv; $start_file = $argv[0]; // 命令 $command = trim($argv[1]); // 子命令,目前只支持-d $command2 = isset($argv[2]) ? $argv[2] : ''; // 检查主进程是否在运行 $master_pid = @file_get_contents(self::$pidFile); $master_is_alive = $master_pid && @posix_kill($master_pid, 0); if($master_is_alive) { if($command === 'start') { self::log("Workerman[$start_file] is running"); } } elseif($command !== 'start' && $command !== 'restart') { self::log("Workerman[$start_file] not run"); } // 根据命令做相应处理 switch($command) { // 启动 workerman case 'start': if($command2 === '-d') { Worker::$daemonize = true; } break; // 显示 workerman 运行状态 case 'status': exit(0); // 重启 workerman case 'restart': // 停止 workeran case 'stop': // 想主进程发送SIGINT信号,主进程会向所有子进程发送SIGINT信号 $master_pid && posix_kill($master_pid, SIGINT); // 如果 $timeout 秒后主进程没有退出则展示失败界面 $timeout = 5; $start_time = time(); while(1) { // 检查主进程是否存活 $master_is_alive = $master_pid && posix_kill($master_pid, 0); if($master_is_alive) { // 检查是否超过$timeout时间 if(time() - $start_time >= $timeout) { self::log("Workerman[$start_file] stop fail"); exit; } usleep(10000); continue; } self::log("Workerman[$start_file] stop success"); // 是restart命令 if($command === 'stop') { exit(0); } // -d 说明是以守护进程的方式启动 if($command2 === '-d') { Worker::$daemonize = true; } break; } break; // 平滑重启 workerman case 'reload': exit; } }
Nach dem Login kopieren

Die Walker-Code-Kommentare sind sehr detailliert:

1 Überleben des Hauptprozesses: Logische UND-Verknüpfung in Zeile 17. Wenn die PID des Hauptprozesses vorhanden ist, wird das Signal 0 an den Prozess gesendet. Tatsächlich wird nur festgestellt, ob der Prozess (oder die Prozessgruppe) aktiv ist Erkennt den aktuellen Benutzer. Haben Sie die Berechtigung, Systemsignale zu senden?

2. Warum wird die Hauptprozess-PID gespeichert? Nachdem das System gestartet ist, läuft es vom aktuellen Terminal weg. Wenn Sie Shutdown- oder andere Befehle ausführen möchten, wird der Befehl in einem anderen Prozess ausgeführt. Wenn wir nicht einmal die Prozess-PID kennen, sollten wir dann das Signal senden Zu?

Die PID des Hauptprozesses muss also gespeichert werden, und der Hauptprozess ist für die Überwachung anderer untergeordneter Prozesse verantwortlich. Daher ist er der Einstiegspunkt für uns, um den Betrieb fortzusetzen.

Worker::runAll()

Die Socket-Programmierung von PHP ähnelt tatsächlich der von C. Letzteres verpackt den Socket neu und stellt die Schnittstelle bereit zu PHP, und die Schritte der Netzwerkprogrammierung unter PHP werden stark reduziert.

Zum Beispiel: stream_socket_server und stream_socket_client erstellen direkt einen Server/Client-Socket (PHP verfügt über zwei Sätze von Socket-Betriebsfunktionen). wm nutzt Ersteres in großem Umfang und der Startvorgang ist wie folgt (die Kommentare sind sehr detailliert):

public static function runAll() { // 初始化环境变量 self::init(); // 解析命令 self::parseCommand(); // 尝试以守护进程模式运行 self::daemonize(); // 初始化所有worker实例,主要是监听端口 self::initWorkers(); // 初始化所有信号处理函数 self::installSignal(); // 保存主进程pid self::saveMasterPid(); // 创建子进程(worker进程)并运行 self::forkWorkers(); // 展示启动界面 self::displayUI(); // 尝试重定向标准输入输出 self::resetStd(); // 监控所有子进程(worker进程) self::monitorWorkers(); }
Nach dem Login kopieren

Lassen Sie uns einfach über die wichtigsten Punkte des Prozesses sprechen:

1 Umgebungsvariablen, wie z. B. Festlegen des Hauptprozessnamens, des Protokollpfads, des Initialisierungs-Timers usw.; 2. Verwenden Sie hauptsächlich die Befehlszeilenparameter $argc und $argc.

3. Generieren Sie einen Daemon-Prozess. Um sich vom aktuellen Terminal zu lösen (vor zwei Jahren dachten die meisten Leute, dass PHP nicht als Daemon verwendet werden kann. Tatsächlich ist dies ein Missverständnis! Tatsächlich Das Prozessmodell von PHP unter Linux ist sehr ausgereift. Ein inländisches Unternehmen wickelt täglich Hunderte Millionen Verbindungen ab, die für Bestell- und Zahlungsanrufe verwendet werden. ;

4. Initialisieren Sie alle Worker-Instanzen (beachten Sie, dass dies im Hauptprozess erfolgt, es werden lediglich eine Reihe von Servern generiert und keine Monitore eingerichtet. Mehr) Das Prozessmodell überwacht den untergeordneten Prozess ist, IO-Multiplexing);

5. Registrieren Sie die Signalverarbeitungsfunktion für den Hauptprozess;

6. Wenn das System läuft, können wir den Systemstatus im Terminal überprüfen oder Befehle zum Herunterfahren oder Neustarten ausführen. Daher müssen wir die PID des Hauptprozesses kennen. Wir wissen, dass der ausführbare Befehl tatsächlich einen neuen Unterprozess unter dem aktuellen Terminal zur Ausführung erstellt. Daher müssen wir die PID des Hauptprozesses kennen, um SIGNAL an den WM-Hauptprozess zu senden Die Verarbeitungsfunktion erfasst das Signal und führt es über einen Rückruf aus.

7. Erstellen Sie einen untergeordneten Prozess und legen Sie den aktuellen Prozessbenutzer (root) fest. Im Multiprozessmodell überwachen zwei Arten von Unterprozessen jeweils unterschiedliche Serveradressen. Im Hauptprozess erstellen wir nur Server und richten weder das Abhören noch eine bestimmte Anzahl von Servern ein.

Der Grund dafür ist, dass ein Fehler gemeldet wird, wenn wir denselben Socket mehrmals in einem Prozess erstellen. Die Anzahl der Worker entspricht tatsächlich der Anzahl der Sockets, dh der Anzahl der untergeordneten Prozesse des Sockets . Der untergeordnete Prozess erbt den Kontext des übergeordneten Prozesses, lauscht jedoch nur auf bestimmte Socket-Ereignisse. Registrieren Sie im untergeordneten Prozess den Server-Socket, um die E/A-Wiederverwendung zu erreichen Rückrufe zum Lesen von Daten und zum Registrieren von Socket-Verbindungen.

10. ) Funktion in einer Endlosschleife, um den Exit-Status des Unterprozesses zu erfassen.

Weitere Informationen zum Workerman finden Sie im

Workerman-Tutorial

Spalte.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Startvorgangs der Workerman-Quellcode-Analyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
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
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!