Heim > Artikel > Backend-Entwicklung > PHPs pcntl-Prozesssteuerung pcntl_fork
Dieser Artikel stellt pcntl_fork hauptsächlich über die pcntl-Prozesssteuerung vor. Er hat einen gewissen Referenzwert. Jetzt kann ich ihn mit allen teilen.
PHP Die Prozesssteuerungsunterstützung implementiert die Prozesserstellung, Programmausführung, Signalverarbeitung und Prozessunterbrechung im Unix-Stil. Die Prozesssteuerung kann nicht in einer Webserverumgebung verwendet werden und kann bei Verwendung in einer Webserverumgebung zu unerwarteten Ergebnissen führen.
In diesem Dokument wird die allgemeine Verwendung der einzelnen Prozesssteuerungsfunktionen erläutert. Für weitere Informationen zur Unix-Prozesssteuerung wird empfohlen, die Systemdokumentation zu fork(2), waitpid(2), signal(2) usw. oder umfassendere Referenzmaterialien wie „Advanced Programming in Unix Environment“ ( Autor: W. Richard Stevens, Addison-Wesley).
PCNTL verwendet jetzt Ticks als Rückrufmechanismus für die Signalverarbeitung. Die Geschwindigkeit von Ticks übertrifft den vorherigen Verarbeitungsmechanismus bei weitem. Diese Änderung folgt der gleichen Semantik wie „Benutzer-Ticks“. Sie können die Anweisung „declare()“ verwenden, um anzugeben, wo in Ihrem Programm Rückrufe stattfinden dürfen. Dadurch können wir den Overhead der asynchronen Ereignisbehandlung minimieren. Das Aktivieren von pcntl beim Kompilieren von PHP verursacht immer diesen Overhead, unabhängig davon, ob pcntl tatsächlich in Ihrem Skript verwendet wird.
Eine Optimierung besteht darin, dass alle pcntl-Skripte vor PHP 4.3.0, damit es funktioniert, entweder „declare()“ in dem Teil (des Codes) verwenden, in dem Rückrufe zulässig sein sollen, oder die neue globale Syntax von verwenden deklarieren(), damit es funktioniert. Gültig im gesamten Skript.
Hinweis: Diese Erweiterung ist auf der Windows-Plattform nicht verfügbar.
pcntl Offizielles Dokument
# 来源官方 PHP 4 >= 4.1.0, PHP 5, PHP 7) pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。 说明 int pcntl_fork ( void ) pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。 返回值 成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
<?php /** * Created by PhpStorm. * User: Object * Date: 2018/6/11 * Time: 10:12 */ const NEWLINE = "\n\n"; if (strtolower(php_sapi_name()) != 'cli') { die("请在cli模式下运行"); } echo "当前进程:" . getmypid() . NEWLINE; $pid = pcntl_fork(); //fork出子进程 //fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立 if ($pid == -1) { // 创建错误,返回-1 die('进程fork失败'); } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id // 父进程逻辑 $time = microtime(true); echo "我是父进程:{$time}".NEWLINE; } else { // $pid = 0 // 子进程逻辑 $time = microtime(true); echo "我是子进程:{$time}".NEWLINE; }
当前进程:17472 我是父进程:1528697500.2961 我是子进程:1528697500.2961
Hier ändern wir die if-Reihenfolge der übergeordneten und untergeordneten Prozesse im obigen Code
if ($pid == -1) { // 创建错误,返回-1 die('进程fork失败'); } else if (!$pid) { // $pid = 0 // 子进程逻辑 $time = microtime(true); echo "我是子进程:{$time}".NEWLINE; } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id // 父进程逻辑 $time = microtime(true); echo "我是父进程:{$time}".NEWLINE; }
当前进程:17472 我是父进程:1528697500.2961 我是子进程:1528697500.2961
Fork führt zuerst die Logik des übergeordneten Prozesses und dann die Logik des untergeordneten Prozesses aus.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich ist. Bitte achten Sie auf die chinesische PHP-Website!
Verwandte Empfehlungen:
PHP verwendet Reflektion, um Klassen und einige grundlegende Anwendungen zu erhalten
Das obige ist der detaillierte Inhalt vonPHPs pcntl-Prozesssteuerung pcntl_fork. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!