Heim  >  Artikel  >  Backend-Entwicklung  >  PHPs pcntl-Prozesssteuerung pcntl_wait

PHPs pcntl-Prozesssteuerung pcntl_wait

不言
不言Original
2018-07-06 17:42:432945Durchsuche

Dieser Artikel stellt hauptsächlich die PCNTL-Prozesssteuerung von PHP vor. Jetzt kann ich ihn mit allen teilen, die ihn benötigen.

Einführung in pcntl_wait

Testcode

# 来源官方

pcntl_wait — 等待或返回fork的子进程状态

int pcntl_wait ( int &$status [, int $options = 0 ] )

wait函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将 被释放。关于wait在您系统上工作的详细规范请查看您系统的wait(2)手册。

Note:
这个函数等同于以-1作为参数pid 的值并且没有options参数来调用pcntl_waitpid() 函数。

参数
status
pcntl_wait()将会存储状态信息到status 参数上,这个通过status参数返回的状态信息可以用以下函数 pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig()以及 pcntl_wstopsig()获取其具体的值。

options
如果您的操作系统(多数BSD类系统)允许使用wait3,您可以提供可选的options 参数。如果这个参数没有提供,wait将会被用作系统调用。如果wait3不可用,提供参数 options不会有任何效果。options的值可以是0 或者以下两个常量或两个常量“或运算”结果(即两个常量代表意义都有效)。

options可用值
WNOHANG    如果没有子进程退出立刻返回。
WUNTRACED    子进程已经退出并且其状态未报告时返回。
返回值
pcntl_wait()返回退出的子进程进程号,发生错误时返回-1,如果提供了 WNOHANG作为option(wait3可用的系统)并且没有可用子进程时返回0。

loop = 1 Ausführungsergebnis

<?php
/**
 * Created by PhpStorm.
 * User: Object
 * Date: 2018/6/11
 * Time: 10:28
 */
if (strtolower(php_sapi_name()) != &#39;cli&#39;) {
    die("请在cli模式下运行");
}

$index = 0;
$loop = 1;
while ($index < $loop) {

    echo "当前进程:" . getmypid() . PHP_EOL;
    $pid = pcntl_fork(); //fork出子进程

    if ($pid == -1) { // 创建错误,返回-1

        die(&#39;进程fork失败&#39;);

    } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

        // 父进程逻辑

        pcntl_wait($status); // 父进程必须等待一个子进程退出后,再创建下一个子进程。

        $child_id = $pid; //子进程的ID
        $pid = posix_getpid(); //获取当前进程Id
        $ppid = posix_getppid(); // 进程的父级ID
        $time = microtime(true);
        echo "我是父进程,fork的子进程id: {$child_id};当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL;

    } else { // $pid = 0

        // 子进程逻辑
        $cid = $pid;
        $pid = posix_getpid();
        $ppid = posix_getppid();
        $myid = getmypid();
        $time = microtime(true);
        echo "我是子进程,当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL;
        //exit;
        //sleep(2);
    }
    $index++;
}

loop = 2 Ausführungsergebnis

当前进程:16604

我是子进程,当前进程id:16605;父进程id:16604; 当前index:0; 当前时间:1528696774.1978

我是父进程,fork的子进程id: 16605;当前进程id:16604;父进程id:15128; 当前index:0; 当前时间:1528696774.2032

loop = 3 Ausführungsergebnis

当前进程:16613

我是子进程,当前进程id:16614;父进程id:16613; 当前index:0; 当前时间:1528696781.4751

当前进程:16614

我是子进程,当前进程id:16615;父进程id:16614; 当前index:1; 当前时间:1528696781.4756

我是父进程,fork的子进程id: 16615;当前进程id:16614;父进程id:16613; 当前index:1; 当前时间:1528696781.4802

我是父进程,fork的子进程id: 16614;当前进程id:16613;父进程id:15128; 当前index:0; 当前时间:1528696781.4858

当前进程:16613

我是子进程,当前进程id:16616;父进程id:16613; 当前index:1; 当前时间:1528696781.4863

我是父进程,fork的子进程id: 16616;当前进程id:16613;父进程id:15128; 当前index:1; 当前时间:1528696781.4913

Zusammenfassung

1. Aus den Ergebnissen mehrerer Ausführungen ist bekannt, dass das Programm Abzweigungen von außen nach innen erstellt. Verlassen Sie dann die letzte Verzweigung
2. Nach einer Verzweigung wird beispielsweise der übergeordnete Prozess des Programms aufgrund von pcntl_wait blockiert und wartet dann darauf, dass der untergeordnete Prozess dieser Verzweigung beendet wird, und dann der übergeordnete Prozess des Der entsprechende untergeordnete Prozess führt die Logik aus und beendet sie
3. Führen Sie dann den übergeordneten Prozess dieses untergeordneten Prozesses aus, um die Logik von Schleife 2 zu verlassen und schließlich den gesamten Prozess zu beenden
Das Obige ist der gesamte Inhalt Ich hoffe, dass dieser Artikel für das Lernen aller hilfreich ist. Bitte achten Sie auf weitere verwandte Inhalte auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

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

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