PHP7 Bugs pcntl_signal(SIGCHLD,SIG_IGN);如何杀死僵尸?

时间:2016-01-23 22:37:48

标签: signals fork zombie-process php-7 pcntl

如果我运行它:

<?php
    declare(ticks = 1);
    for($i=0;$i<300;$i++){
            $pid = pcntl_fork();
                if ($pid == -1) {
                     die('could not fork');
                } else if ($pid) {
                        usleep(2500);

                } else {
                        echo 'Child'.$i."\r\n";
                        sleep(mt_rand(1,3));

                        exit;
                }

    }
    echo 'Test123';
    pcntl_signal(SIGCHLD, SIG_IGN);
    sleep(60)
    echo 'Test456';
?>

在PHP5上。我看到多个ChildTest123,60秒后,我看到Test456

但是!在PHP7上,我看到多个Child Test123而不是Test456 - 睡眠不起作用。

在生产php-daemon中,我看到pcntl_signal(SIGCHLD, SIG_IGN);不再帮助杀死僵尸了!它不起作用。

我能做什么?

2 个答案:

答案 0 :(得分:1)

$p = pcntl_waitpid(-1,$status,WNOHANG); 

没有处理程序。在创建后的父级。

答案 1 :(得分:0)

好的:)我找到答案:)

declare(ticks = 1);

- 在剧本

上排名第一

该功能对全球:

    function signal_handler($signal) {
        switch($signal) {
            case SIGCHLD:
                while (pcntl_waitpid(0, $status) != -1) {
                    $status = pcntl_wexitstatus($status);
                    echo "Child $status completed\n";
                }

                exit;
        }
    }

这在父母的叉子之后

pcntl_signal(SIGCHLD, "signal_handler");