Heim >Backend-Entwicklung >PHP-Tutorial >[PHP]Arbeitsteilung zwischen mehreren Prozessen von swoole_server

[PHP]Arbeitsteilung zwischen mehreren Prozessen von swoole_server

WBOY
WBOYOriginal
2016-07-30 13:30:27910Durchsuche

[PHP]swoole_server进程的分工


Zusammenfassung: Swoole ist ein leistungsstarkes Netzwerkkommunikations-Framework in PHP-Sprache. Es bietet asynchronen Multithread-Server in PHP-Sprache, asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, Datenbankverbindungspool, AsyncTask und Nachrichtenwarteschlange , Millisekunden-Timer, asynchrones Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage. Leistungsstarke Funktionen werden durch mehrere Prozesse mit klarer Arbeitsteilung dahinter realisiert. Hier stellen wir die Arbeitsteilung mehrerer Prozesse im Detail vor, damit Anfänger das Swoole-Framework schneller verstehen können.


  • Blog: http://www.cnblogs.com/jhzhu
  • E-Mail: jhzhuustc@gmail.com
  • Autor: Zhimingso
  • Zeit: 2015-08-17

Verzeichnis

  • [PHP]Arbeitsteilung im swoole_server-Prozess
    • Verzeichnis
    • Swoole-Einführung
      • Swoole: PHP neu definieren
      • Funktionsdemonstrationscode-Snippet
        • TCP-Server
        • TCP-Client
    • Hauptprozessanalyse
      • Masterprozess
      • Managerprozess
      • Arbeiterprozess
      • Aufgabenprozess
    • Korrespondenz zwischen Prozessen und Ereignisrückrufen
      • Rückruffunktion im Master-Prozess
      • Rückruffunktion im Worker-Prozess
      • Aufgabenprozess Die Rückruffunktion
      • Die Rückruffunktion im Manager-Prozess

Swoole-Einführung

Offizielle Swoole-Website

Swoole: PHP neu definiert

Swoole: Ein leistungsstarkes Netzwerkkommunikations-Framework für die PHP-Sprache, das einen asynchronen Multithread-Server der PHP-Sprache, einen asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL und einen Datenbankverbindungspool bereitstellt , AsyncTask, Nachrichtenwarteschlange, Millisekunden-Timer, asynchrones Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage. Obwohl Swoole eine Standard-PHP-Erweiterung ist, unterscheidet sie sich tatsächlich von gewöhnlichen Erweiterungen. Gewöhnliche Erweiterungen stellen lediglich eine Bibliotheksfunktion bereit. Die Swoole-Erweiterung übernimmt nach der Ausführung die Kontrolle über PHP und tritt in die Ereignisschleife ein. Wenn ein E/A-Ereignis auftritt, ruft swoole automatisch die angegebene PHP-Funktion zurück.

Funktionsdemonstrationscode-Snippet

TCP-Server

<span>$serv = new swoole_server("127.0.0.1", 9501);</span><span>$serv->set(array(</span><span>    'worker_num' => 8,   //工作进程数量</span><span>    'daemonize' => true, //是否作为守护进程</span><span>));</span><span>$serv->on('connect', function ($serv, $fd){</span><span>    echo "Client:Connect.\n";</span><span>});</span><span>$serv->on('receive', function ($serv, $fd, $from_id, $data) {</span><span>    $serv->send($fd, 'Swoole: '.$data);</span><span>    $serv->close($fd);</span><span>});</span><span>$serv->on('close', function ($serv, $fd) {</span><span>    echo "Client: Close.\n";</span><span>});</span><span>$serv->start();</span>

TCP-Client

<span>$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);</span><span>//设置事件回调函数</span><span>$client->on("connect", function($cli) {</span><span>    $cli->send("hello world\n");</span><span>});</span><span>$client->on("receive", function($cli, $data){</span><span>    echo "Received: ".$data."\n";</span><span>});</span><span>$client->on("error", function($cli){</span><span>    echo "Connect failed\n";</span><span>});</span><span>$client->on("close", function($cli){</span><span>    echo "Connection close\n";</span><span>});</span><span>//发起网络连接</span><span>$client->connect('127.0.0.1', 9501, 0.5);</span>

Weitere Codeausschnitte finden Sie auf der offiziellen Website von swoole.

Hauptprozessanalyse

Master-Prozess

Der Master-Prozess wird hauptsächlich verwendet, um den Betrieb des Swoole-Framework-Mechanismus sicherzustellen. Es werden mehrere funktionale Threads erstellt:

  • Reaktor-Thread: Dies 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. Senden Sie Daten an den TCP-Client, wenn der Socket beschreibbar ist.
  • Master-Thread (Haupt-Thread): Verantwortlich für: Akzeptieren neuer Verbindungen, UNIX PROXI-Signalverarbeitung und Timer-Aufgaben.
  • Heartbeat-Paketerkennungsthread: (weggelassen)
  • UDP-Paketempfangsthread: (weggelassen)

Manager-Prozess

Worker/Aufgabe in swoole Prozesse werden vom Manager-Prozess geforkt und verwaltet.

  • Wenn der untergeordnete Prozess endet, ist der Managerprozess dafür verantwortlich, den untergeordneten Prozess wiederzuverwenden, um zu vermeiden, dass er zu einem Zombie-Prozess wird. Und erstellen Sie einen neuen Unterprozess
  • Wenn der Server heruntergefahren wird, sendet der Managerprozess Signale an alle Unterprozesse, um die Unterprozesse zu benachrichtigen, den Dienst herunterzufahren
  • Wenn der Wenn der Server neu geladen wird, fährt der Manager-Prozess die Unterprozesse nacheinander herunter/neu.

Warum nicht der Master-Prozess? Der Hauptgrund ist, dass der Master-Prozess multithreaded ist Gabeloperationen können nicht sicher durchgeführt werden.

Arbeitsprozess

  • akzeptiert das vom Reactor-Thread gelieferte Anforderungspaket und führt die PHP-Rückruffunktion aus, um die Daten zu verarbeiten.
  • generiert Antwortdaten und sendet sie Es wird an den Reactor-Thread gesendet und vom Reactor-Thread an den TCP-Client gesendet.
  • kann sich im asynchronen, nicht blockierenden Modus oder im synchronen Blockierungsmodus befinden.
  • Worker wird in einem Multiprozessmodus ausgeführt

Swoole bietet einen vollständigen Prozessverwaltungsmechanismus, wenn der Worker-Prozess abnormal beendet wird, z. B. bei einem schwerwiegenden PHP-Fehler, wenn er versehentlich von anderen Programmen beendet wird oder wenn er 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.

Aufgabenprozess

  • akzeptiert Aufgaben, die vom Worker-Prozess über die swoole_server->task/taskwait-Methode bereitgestellt werden
  • verarbeitet die Aufgaben und gibt das Ergebnis zurück Daten für den Worker-Prozess
  • Es handelt sich um einen vollständig synchronen Blockierungsmodus
  • Aufgabe wird in mehreren Prozessen ausgeführt

Der vollständige Name des Task-Prozesses lautet task_worker-Prozess , was eine besondere Art von Arbeitsprozess ist. Daher wird onWorkerStart auch im Aufgabenprozess aufgerufen. Wenn $worker_id >= $serv->setting['worker_num'], bedeutet dies, dass dieser Prozess ein task_worker ist, andernfalls bedeutet es, dass dieser Prozess ein Arbeitsprozess ist.

Korrespondenz zwischen Prozessen und Event-Callbacks

Callback-Funktionen im Master-Prozess

<span>onStart</span><span>onShutdown</span><span>onMasterConnect</span><span>onMasterClose</span><span>onTimer</span>

Callback-Funktionen im Worker-Prozess

<span>onWorkerStart</span><span>onWorkerStop</span><span>onConnect</span><span>onClose</span><span>onReceive</span><span>onTimer</span><span>onFinish</span>

Rückruffunktion im Aufgabenprozess

<span>onTask</span><span>onWorkerStart</span>

Rückruffunktion im Managerprozess

<span>onManagerStart</span><span>onManagerStop</span>
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