7

* 以下の回答の解決策*

マルチフォーク php スクリプトで子を制限する際に問題が発生しました...最後の子が終わらないようです...本当に疲れていて、エラーが見つかりません。助けていただけますか? なかなか終わらない…。

<?php
declare(ticks = 1);

$max=5;
$child=0;

function sig_handler($signo) {
    global $child;
    switch ($signo) {
        case SIGCHLD:
        $child -= 1;
        echo "[-]";
    }
}

pcntl_signal(SIGCHLD, "sig_handler");

$found = array(1,2,3,4,5,6,7,8,9,10,11,12);

echo "LETS GO!\n";

foreach($found as $item){

            while ($child >= $max) {
            sleep(1);
        }

        $child++;
        echo "[+]";
        $pid=pcntl_fork();

        if($pid){
        }else{ // CHILD
            sleep(rand(1,5));
            echo "[~]";
            exit(0);
        }

}

while($child != 0){
    echo "($child)";
    sleep(1);
}

echo "THE END.\n"

?>

ほとんどの場合、結果は次のとおりです。

[+][+][+][+][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][~][~][-][+]    (5)[-](4)(4)[~][-](3)[~][-](2)(2)[~](2)[-](1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)... etc etc ...

最後の子がまったく終了しないか、少なくとも sig ハンドラーをトリガーしないようです...

  • [+] <- 分岐直前 - カウント: 12
  • [~] <- 子が終了する直前 - カウント: 12
  • [-] <- 子終了後の sig ハンドラー - カウント: 11

ヘルプ?

PS。奇妙なことは、それが時々終わるということです。

4

1 に答える 1