Analyse der PHP-Multiprozessprogrammierung

藏色散人
Freigeben: 2023-04-09 21:10:02
nach vorne
2774 Leute haben es durchsucht

Empfohlen: „PHP-Video-Tutorial

PHP-Multiprozessprogrammierung

Vorteile der Verwendung von Multiprozessen:

    1. 使用多进程, 子进程结束以后, 内核会负责回收资源
    2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.
    3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.
Nach dem Login kopieren

Um Multiprozesse in PHP zu implementieren, los geht's.

Wir müssen installieren die pcnt-Erweiterung

pcntl Dies ist die Abkürzung für Prozesssteuerung. Normalerweise installiert PHP diese Erweiterung standardmäßig. Verwenden Sie die Funktion phpinfo(), um zu überprüfen, ob die Erweiterung vorhanden ist.

Analyse der PHP-Multiprozessprogrammierung

Verwenden Sie die Funktion pcntl_fork(), um einen untergeordneten Prozess zu erstellen.

Mit pcntl_fork wird ein untergeordneter Prozess erstellt, der mit dem aktuellen Prozess identisch ist. hat aber ein eigenes Datensegment. Schauen wir uns die einfachste Methode zum Erstellen eines Unterprozesses an:

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}
?>
Nach dem Login kopieren
pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。
Nach dem Login kopieren

Ausgabeergebnisse:

Analyse der PHP-Multiprozessprogrammierung

Recycling von Unterprozessen

① Blockierungsmethode
Haben Sie gerade ps? Im Allgemeinen bin ich es gewohnt, den Befehl ps aux plus grep zu verwenden, um laufende Hintergrundprozesse zu finden. Es gibt eine Spalte STAT, die den laufenden Status jedes Prozesses angibt. Hier konzentrieren wir uns auf Zustand Z: Zombie. Wenn der untergeordnete Prozess vor dem übergeordneten Prozess beendet wird und der übergeordnete Prozess nichts damit macht, wird der untergeordnete Prozess zu einem Zombie-Prozess. Obwohl Zombie-Prozesse nicht viel Speicher beanspruchen, sind sie ein Dorn im Auge. (Vergessen Sie nicht, dass sie immer noch die PID belegen)

Im Allgemeinen recyceln Sie einfach den toten untergeordneten Prozess, bevor der übergeordnete Prozess endet. In der pcntl-Erweiterung gibt es eine Funktion pcntl_wait(). Diese Methode wartet auf das Ende des Prozesses und führt den beendeten Prozess dann erneut durch.

<?php /**
 *  hedong
 * @date 2017-04-03
 */

$parentPid = getmypid(); // 获取父进程id $childPid = pcntl_fork(); // 创建子进程 switch($childPid) {
    case -1:
        print "创建子进程失败!".PHP_EOL;
        exit;
    case 0:
        print "我是子进程,进程ID:{$childPid}".PHP_EOL;
        break;
    default:
        pcntl_wait($status); // 子进程执行完后才执行父进程         print "我是父进程,进程ID:{$parentPid},子进程ID: {$childPid}".PHP_EOL;
}
Nach dem Login kopieren

② Nicht blockierende Methode
Blockierende Methode verliert die Parallelität von Mehrprozessen. Es gibt auch eine Möglichkeit, den abgeschlossenen untergeordneten Prozess zu recyceln und zu parallelisieren. Dies ist der nicht blockierende Weg.

<?php /**
 *  hedong
 * @date 2017-04-03
 */

for ($i = 1; $i <= 5; ++$i) {
    $pid = pcntl_fork(); // 创建子进程

    if (!$pid) {
        sleep(1);
        print "In child $i\n";
        exit($i);
    }
}

// pcntl_waitpid 第一个参数为 0 代表处理全部子进程

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    echo "Child $status completed\n";
}
Nach dem Login kopieren

Was passiert, wenn der übergeordnete Prozess zuerst stirbt?

Was wird passieren? Es passiert nichts, der untergeordnete Prozess läuft noch. Zu diesem Zeitpunkt wird der untergeordnete Prozess jedoch an Prozess Nr. 1 übergeben, und Prozess Nr. 1 wird zum Stiefvater dieser untergeordneten Prozesse. Prozess Nr. 1 kümmert sich sorgfältig um die Ressourcen dieser Prozesse und Prozess Nr. 1 fordert die Ressourcen automatisch zurück, wenn sie beendet sind. Eine weitere vorübergehende Möglichkeit, mit Zombie-Prozessen umzugehen, besteht darin, den übergeordneten Prozess herunterzufahren.

Abschließende Dinge, die Sie beachten sollten:

Die Prozesssteuerung kann nicht in einer Webserverumgebung angewendet werden. Wenn sie in einer Webdienstumgebung verwendet wird, kann es zu unerwarteten Ergebnissen kommen. – Auszug aus dem PHP-Handbuch

Referenz:

http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing

http://www.jb51.net/article/71232.htm

http://www.laruence.com/2009/06/11/930.html

http://imhuchao.com/596.html

https://www.pureweber.com/article/php-multi-process-programming-preview/
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAnalyse der PHP-Multiprozessprogrammierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.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
Beliebte Tutorials
Mehr>
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!