Maison  >  Article  >  développement back-end  >  Contrôle de processus pcntl de PHP pcntl_wait

Contrôle de processus pcntl de PHP pcntl_wait

不言
不言original
2018-07-06 17:42:432898parcourir

Cet article présente principalement pcntl_wait sur le contrôle de processus pcntl de PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Introduction à pcntl_wait

# 来源官方

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。
<.>Code de test

<?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++;
}
boucle = 1 résultat d'exécution

当前进程:16604

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

我是父进程,fork的子进程id: 16605;当前进程id:16604;父进程id:15128; 当前index:0; 当前时间:1528696774.2032
boucle = 2 résultat d'exécution

当前进程: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
boucle = 3 résultat d'exécution

当前进程:16625

我是子进程,当前进程id:16626;父进程id:16625; 当前index:0; 当前时间:1528696787.3334

当前进程:16626

我是子进程,当前进程id:16627;父进程id:16626; 当前index:1; 当前时间:1528696787.3338

当前进程:16627

我是子进程,当前进程id:16628;父进程id:16627; 当前index:2; 当前时间:1528696787.3345

我是父进程,fork的子进程id: 16628;当前进程id:16627;父进程id:16626; 当前index:2; 当前时间:1528696787.3391

我是父进程,fork的子进程id: 16627;当前进程id:16626;父进程id:16625; 当前index:1; 当前时间:1528696787.3434

当前进程:16626

我是子进程,当前进程id:16629;父进程id:16626; 当前index:2; 当前时间:1528696787.3441

我是父进程,fork的子进程id: 16629;当前进程id:16626;父进程id:16625; 当前index:2; 当前时间:1528696787.3496

我是父进程,fork的子进程id: 16626;当前进程id:16625;父进程id:15128; 当前index:0; 当前时间:1528696787.3543

当前进程:16625

我是子进程,当前进程id:16630;父进程id:16625; 当前index:1; 当前时间:1528696787.3548

当前进程:16630

我是子进程,当前进程id:16631;父进程id:16630; 当前index:2; 当前时间:1528696787.3555

我是父进程,fork的子进程id: 16631;当前进程id:16630;父进程id:16625; 当前index:2; 当前时间:1528696787.3599

我是父进程,fork的子进程id: 16630;当前进程id:16625;父进程id:15128; 当前index:1; 当前时间:1528696787.3643

当前进程:16625

我是子进程,当前进程id:16632;父进程id:16625; 当前index:2; 当前时间:1528696787.3649

我是父进程,fork的子进程id: 16632;当前进程id:16625;父进程id:15128; 当前index:2; 当前时间:1528696787.3697
Résumé

1. À partir des résultats d'exécutions multiples, on sait que le programme crée des forks de l'extérieur vers l'intérieur. Sortez ensuite du dernier fork
2 Par exemple, après un fork, le processus parent du programme est bloqué à cause de pcntl_wait, puis attend que le processus enfant de ce fork se termine, puis le processus parent du. le processus enfant correspondant exécute la logique et quitte
3. Exécutez ensuite le processus parent de ce processus enfant afin de quitter la logique de la boucle 2, et enfin terminer le processus total
Ce qui précède est l'intégralité du contenu. de cet article, j'espère qu'il sera utile à l'apprentissage de chacun, veuillez faire attention au contenu plus connexe du site Web PHP chinois !

Recommandations associées :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn