*解决方案以下答案*
我遇到了限制多线程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"
Run Code Online (Sandbox Code Playgroud)
?>
结果大部分时间是:
[+][+][+][+][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][-][+][~][~][~][-][+] (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 ...
Run Code Online (Sandbox Code Playgroud)
好像最后一个孩子根本没有结束,或者至少它不会触发sig处理程序......
救命?
PS.奇怪的是它有时会结束.
好的找到了解决方案:
function sig_handler($signo){
global $child;
switch ($signo) {
case SIGCLD:
while( ( $pid = pcntl_wait ( $signo, WNOHANG ) ) > 0 ){
$signal = pcntl_wexitstatus ($signo);
$child -= 1;
echo "[-]";
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于在UNIX系统上处理信号.在相似时间发送的所有sig被分组为一个.上面的函数修复了这个问题.而且不仅仅是那个...当孩子立即退出时,它不再是段错误(某些PHP配置/版本中的"zend_mm_heap corrupted"错误)了.它在之前的案例中做过.
PS.我应该删除这个问题,但是我会为遇到类似问题的每个人留下解决方案,因为PHP脚本中的多线程对某些任务非常有用.
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |