* 以下の回答の解決策*
マルチフォーク 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。奇妙なことは、それが時々終わるということです。