Heim Backend-Entwicklung PHP7 Eine vorläufige Studie zu mehreren Prozessen in PHP7

Eine vorläufige Studie zu mehreren Prozessen in PHP7

Apr 04, 2019 pm 01:52 PM
php7 多进程

Vorbereitung

Wir alle wissen, dass PHPs Umgang mit Multi-Parallelität hauptsächlich vom Multiprozess des Servers oder PHP-FPM abhängt Die Wiederverwendung ihrer Prozesse, aber auch die Implementierung mehrerer PHP-Prozesse ist von großer Bedeutung, insbesondere bei der Verarbeitung großer Datenmengen oder der Ausführung von Hintergrund-DEMON Daemon-Prozessen im Hintergrund-CLI-Modus. Es erübrigt sich zu erwähnen, dass mehrere Prozesse Vorteile bieten.

PHPs Multithreading wurde ebenfalls erwähnt, aber das Problem der gemeinsamen Nutzung und Zuweisung von Multithread-Ressourcen innerhalb des Prozesses ist schwer zu lösen. PHP verfügt auch über eine Multithreading-Erweiterung pthreads , diese gilt jedoch als instabil und erfordert eine Thread-sichere Umgebung, sodass sie nicht häufig verwendet wird.

In der Vergangenheit hat ein großer Meister in der PHP-Gruppe einmal darauf hingewiesen, dass, wenn Hintergrund-PHP vorankommen will, Multiprozesse vermieden werden müssen. Zufälligerweise verwendet der Daemon-Prozess im Unternehmen auch die Multiprozesse von PHP. Prozess, kombiniert mit den verschiedenen Informationen und Handbüchern von Gu Ge, habe ich endlich die Multiverarbeitung verstanden und eine kleine Demo geschrieben (implementiert auf einem Linux-System). Wenn es Fehler oder Auslassungen gibt, danke Ihnen, dass Sie sie erwähnt haben.

Um Multi-Processing in PHP zu implementieren, benötigen wir zwei Erweiterungen pcntl und posix. Die Installationsmethode wird hier nicht beschrieben.

In PHP verwenden wir pcntl_fork(), um mehrere Prozesse zu erstellen (bei der C-Sprachprogrammierung von *NIX-Systemen generieren vorhandene Prozesse neue Prozesse durch Aufrufen der Fork-Funktion). Der neue Prozess nach der Verzweigung wird zum untergeordneten Prozess, der ursprüngliche Prozess wird zum übergeordneten Prozess und der untergeordnete Prozess verfügt über eine Kopie des übergeordneten Prozesses. Beachten Sie hier:

• Der untergeordnete Prozess teilt das Programmtextsegment mit dem übergeordneten Prozess

• Der untergeordnete Prozess verfügt über eine Kopie des Datenraums sowie des Heaps und Stapels des übergeordneten Prozesses. Beachten Sie, dass dies der Fall ist eine Kopie, keine Freigabe

• Der übergeordnete Prozess und der untergeordnete Prozess führen den Programmcode nach der Verzweigung weiter aus

• Nach der Verzweigung, unabhängig davon, ob der übergeordnete Prozess oder der untergeordnete Prozess ausgeführt wird Erstens kann es nicht bestätigt werden, und es hängt von der Systemplanung ab (abhängig von der Überzeugung)

Hier wird gesagt, dass der untergeordnete Prozess eine Kopie des Datenraums, des Heaps und des Stapels des übergeordneten Prozesses hat Bei den meisten Implementierungen handelt es sich nicht um eine wirklich vollständige Kopie. Noch wichtiger ist, dass die COW-Technologie (Copy On Write) verwendet wird, um Speicherplatz zu sparen. Vereinfacht ausgedrückt: Wenn weder der übergeordnete Prozess noch der untergeordnete Prozess diese Daten, den Heap und den Stapel ändert, teilen sich der übergeordnete Prozess und der untergeordnete Prozess vorübergehend dieselben Daten, denselben Heap und denselben Stapel. Nur wenn der übergeordnete oder untergeordnete Prozess versucht, die Daten, den Heap und den Stapel zu ändern, wird ein Kopiervorgang ausgeführt. Dies wird als Kopieren beim Schreiben bezeichnet.

Nach dem Aufruf von pcntl_fork() gibt die Funktion zwei Werte zurück. Gibt die Prozess-ID des untergeordneten Prozesses im übergeordneten Prozess und die Zahl 0 im untergeordneten Prozess selbst zurück. Da in der Apache- oder FPM-Umgebung mehrere Prozesse nicht ordnungsgemäß ausgeführt werden können, müssen Sie den Code in der PHP-CLI-Umgebung ausführen.

Erstellen eines Unterprozesses

Das Erstellen eines PHP-Unterprozesses ist der Beginn mehrerer Prozesse. Wir benötigen die Funktion pcntl_fork()

ausführliche Erklärung der Fork-Funktion

– Erzeugen Sie einen Zweig (untergeordneten Prozess) an der aktuellen Position des aktuellen Prozesses. Nachdem diese Funktion einen neuen untergeordneten Prozess erstellt hat, erbt der untergeordnete Prozess den aktuellen Kontext des übergeordneten Prozesses und führt die Ausführung von der pcntl_fork()  -Funktion nach unten wie der übergeordnete Prozess fort, mit der Ausnahme, dass der erhaltene Rückgabewert von pcntl_fork() unterschiedlich ist. Daher können wir den übergeordneten Prozess und den untergeordneten Prozess anhand des Rückgabewerts unterscheiden und dem übergeordneten Prozess und dem untergeordneten Prozess unterschiedliche logische Verarbeitungen zuweisen. pcntl_fork()

Wenn die Funktion pcntl_fork() erfolgreich ausgeführt wird, gibt sie die Prozess-ID (PID) des untergeordneten Prozesses im übergeordneten Prozess zurück, da die PID des anfänglichen Prozesses des Systems 1 ist, die PID von Die nachfolgenden Prozesse sind größer als dieser Prozess. Wir können also bestätigen, dass der aktuelle Prozess der übergeordnete Prozess ist, indem wir beurteilen, ob der Rückgabewert von pcntl_fork() im untergeordneten Prozess größer als 1 ist ein fester Wert von 0. Wir können auch beurteilen, dass der Rückgabewert von pcntl_fork() 0 ist. Um den untergeordneten Prozess zu bestimmen, wenn die Ausführung der Funktion pcntl_fork() fehlschlägt, gibt er natürlich -1 im übergeordneten Prozess zurück Es wird kein untergeordneter Prozess generiert.

Fork-Prozessinstanz

Fork-Kindprozess

$ppid = posix_getpid();
$pid = pcntl_fork();
if ($pid == -1) {
    throw new Exception('fork child process fail');
} elseif ($pid > 0) {
    cli_set_process_title("我是父 process,pid is : {$ppid}.");
    sleep(30);
} else {
    $cpid = posix_getpid();
    cli_set_process_title("我是 {$ppid} 子的 process,我的 process pid is : {$cpid}.");
    sleep(30);
}
Nach dem Login kopieren

Beschreibung:

posix_getpid(): Gibt die aktuelle Prozess-ID zurück

cli_set_process_title('Prozessname'): Geben Sie dem aktuellen Prozess einen lauten Namen.

Wenn wir dieses Beispiel ausführen, können wir die aktuellen beiden PHP-Prozesse sehen.

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ ps aux|grep -v grep |grep 我
www      18026  0.5  1.2 204068 25772 pts/0    S+   14:08   0:00 我是父 process,pid is : 18026.
www      18027  0.0  0.3 204068  6640 pts/0    S+   14:08   0:00 我 18026 子的 process,我的 process pid is : 18027. 
Nach dem Login kopieren

Der erste Abschnitt des Codes: Nachdem das Programm von pcntl_fork() gestartet wurde, führen der übergeordnete Prozess und der untergeordnete Prozess weiterhin den Code aus:

$pid = pcntl_fork();
if( $pid > 0 ){
  echo "我是父亲".PHP_EOL;
} else if( 0 == $pid ) {
  echo "我是儿子".PHP_EOL;
} else {
  echo "fork失败".PHP_EOL;
} 
Nach dem Login kopieren

Ergebnis:

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 123.php
我是父亲
我是儿子
Nach dem Login kopieren

Der zweite Abschnitt Code soll veranschaulichen, dass der untergeordnete Prozess eine Kopie der Daten des übergeordneten Prozesses hat, anstatt sie zu teilen:

// 初始化一个 number变量 数值为1
$number = 1;
$pid = pcntl_fork();
if ($pid > 0) {
    $number += 1;
    echo "我是父亲,number+1 : { $number }" . PHP_EOL;
} else if (0 == $pid) {
    $number += 2;
    echo "我是儿子,number+2 : { $number }" . PHP_EOL;
} else {
    echo "fork失败" . PHP_EOL;
}
Nach dem Login kopieren

Ergebnis

www@iZ2zec3dge6rwz2uw4tveuZ:~/test$ php 1234.php
我是父亲,number+1 : { 2 }
我是儿子,number+2 : { 3 }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonEine vorläufige Studie zu mehreren Prozessen in PHP7. 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)

Anwendungsmethode des gemeinsam genutzten Speichers zwischen mehreren Prozessen in der Golang-Funktion Anwendungsmethode des gemeinsam genutzten Speichers zwischen mehreren Prozessen in der Golang-Funktion May 17, 2023 pm 12:52 PM

Als hochgradig gleichzeitige Programmiersprache ermöglichen der integrierte Coroutine-Mechanismus und die Multithread-Operationen von Golang ein leichtes Multitasking. In einem Multiprozess-Verarbeitungsszenario sind jedoch die Kommunikation und der gemeinsame Speicher zwischen verschiedenen Prozessen zu Schlüsselthemen bei der Programmentwicklung geworden. In diesem Artikel wird die Anwendungsmethode zur Realisierung des gemeinsamen Speichers zwischen mehreren Prozessen in Golang vorgestellt. 1. So implementieren Sie Multiprozesse in Golang In Golang kann die gleichzeitige Verarbeitung mehrerer Prozesse auf verschiedene Arten implementiert werden, einschließlich Fork, os.Process,

So installieren Sie die Mongo-Erweiterung in PHP7.0 So installieren Sie die Mongo-Erweiterung in PHP7.0 Nov 21, 2022 am 10:25 AM

So installieren Sie die Mongo-Erweiterung in PHP7.0: 1. Erstellen Sie die Mongodb-Benutzergruppe und den Mongodb-Benutzer. 2. Laden Sie das Mongodb-Quellcodepaket herunter und platzieren Sie das Quellcodepaket im Verzeichnis „/usr/local/src/“. Geben Sie das Verzeichnis „src/“ ein. 4. Entpacken Sie das Quellcodepaket. 6. Kopieren Sie die Dateien in das Verzeichnis „mongodb/“.

So lösen Sie das Problem, wenn PHP7 erkennt, dass der TCP-Port nicht funktioniert So lösen Sie das Problem, wenn PHP7 erkennt, dass der TCP-Port nicht funktioniert Mar 22, 2023 am 09:30 AM

In PHP5 können wir die Funktion fsockopen() verwenden, um den TCP-Port zu erkennen. Mit dieser Funktion können Sie eine Netzwerkverbindung herstellen und eine Netzwerkkommunikation durchführen. In PHP7 kann die Funktion fsockopen() jedoch auf einige Probleme stoßen, z. B. dass der Port nicht geöffnet werden kann, keine Verbindung zum Server hergestellt werden kann usw. Um dieses Problem zu lösen, können wir die Funktionen socket_create() und socket_connect() verwenden, um den TCP-Port zu erkennen.

Was soll ich tun, wenn das Plug-in in php7.0 installiert ist, aber immer noch angezeigt wird, dass es nicht installiert ist? Was soll ich tun, wenn das Plug-in in php7.0 installiert ist, aber immer noch angezeigt wird, dass es nicht installiert ist? Apr 02, 2024 pm 07:39 PM

So beheben Sie das Problem, dass das Plugin in PHP 7.0 nicht installiert ist: Überprüfen Sie die Plugin-Konfiguration und aktivieren Sie das Plugin. Starten Sie PHP neu, um die Konfigurationsänderungen zu übernehmen. Überprüfen Sie die Berechtigungen der Plugin-Datei, um sicherzustellen, dass sie korrekt sind. Installieren Sie fehlende Abhängigkeiten, um sicherzustellen, dass das Plugin ordnungsgemäß funktioniert. Wenn alle anderen Schritte fehlschlagen, erstellen Sie PHP neu. Weitere mögliche Ursachen sind inkompatible Plugin-Versionen, das Laden der falschen Version oder PHP-Konfigurationsprobleme.

Lassen Sie uns über Multiprozess und Multithreading in Node.js sprechen Lassen Sie uns über Multiprozess und Multithreading in Node.js sprechen Jul 25, 2022 pm 07:45 PM

Jeder weiß, dass Node.js Single-Threading ist, aber er weiß nicht, dass es auch ein Multi-Thread-Modul bietet, um die Verarbeitung einiger spezieller Aufgaben zu beschleunigen. Dieser Artikel führt Sie zum Verständnis des Multi-Threading von Node. js, in der Hoffnung, mehr darüber zu erfahren.

Ist Golang Multiprozess? Ist Golang Multiprozess? Jul 07, 2023 am 10:18 AM

Golang ist ein Multiprozess und sein Thread-Modell ist das MPG-Modell. Insgesamt entsprechen Go-Prozesse und Kernel-Threads vielen-zu-vielen, daher müssen sie zunächst multithreaded sein. Golang verfügt über ein sogenanntes M-Verhältnis-N-Modell, mit dem N-Threads erstellt werden können. Im Allgemeinen ist N viel größer als M. Es handelt sich jedoch im Wesentlichen um ein Multithread-Modell Es wird betont, dass Entwickler Kanäle für die Synchronisierung zwischen Coroutinen verwenden sollten.

So installieren und implementieren Sie PHP7.0 So installieren und implementieren Sie PHP7.0 Nov 30, 2022 am 09:56 AM

So installieren und implementieren Sie PHP7.0: 1. Gehen Sie zur offiziellen PHP-Website, um die dem lokalen System entsprechende Installationsversion herunterzuladen. 2. Extrahieren Sie die heruntergeladene ZIP-Datei in das angegebene Verzeichnis. 3. Öffnen Sie das Befehlszeilenfenster und gehen Sie zu das Verzeichnis „E:\php7“ Führen Sie einfach den Befehl „php -v“ aus.

FAQ-Leitfaden zur PHP-Serverumgebung: Häufige Probleme schnell lösen FAQ-Leitfaden zur PHP-Serverumgebung: Häufige Probleme schnell lösen Apr 09, 2024 pm 01:33 PM

Zu den gängigen Lösungen für PHP-Serverumgebungen gehört die Sicherstellung, dass die richtige PHP-Version installiert ist und relevante Dateien in das Modulverzeichnis kopiert wurden. Deaktivieren Sie SELinux vorübergehend oder dauerhaft. Überprüfen und konfigurieren Sie PHP.ini, um sicherzustellen, dass die erforderlichen Erweiterungen hinzugefügt und korrekt eingerichtet wurden. Starten oder starten Sie den PHP-FPM-Dienst neu. Überprüfen Sie die DNS-Einstellungen auf Auflösungsprobleme.

See all articles