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

PHP7 Bugs pcntl_signal(SIGCHLD, SIG_IGN); how to kill zombies?

如果我运行它:

<?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); 不再帮助杀死僵尸了!没用。

我能做什么?

好的 :) 我找到了答案 :)

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;
        }
    }

这是在 parent 中的分支之后

pcntl_signal(SIGCHLD, "signal_handler");    
$p = pcntl_waitpid(-1,$status,WNOHANG); 

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