<?php
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i];
}
$childs = array();
for($i = 0; $i < 10; $i++) {
$pid = pcntl_fork();
if($pid == -1)
die('Could not fork');
if ($pid) { //主进程执行
echo "parent \n";
$childs[] = $pid;
} else { //子进程执行
for($i =1;$i<10;$i++)
{
$pid = posix_getpid();
echo '当前进程'.$pid.PHP_EOL;
echo '当前循环'.$i.PHP_EOL;
echo '占用内存'.convert(memory_get_usage()) . PHP_EOL;
sleep(1);
}
exit();
}
}
while(count($childs) > 0) {
foreach($childs as $key => $pid) {
$res = pcntl_waitpid($pid, $status, WNOHANG);
if($res == -1 || $res > 0)
unset($childs[$key]);
}
sleep(1);
}
或:
<?php
function convert($size)
{
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i];
}
//最大的子进程数量
$maxChildPro = 8;
//当前的子进程数量
$curChildPro = 0;
//当子进程退出时,会触发该函数
function sig_handler($sig)
{
global $curChildPro;
switch($sig)
{
case SIGCHLD:
//当前进程数减一,同时控制段会启动一新进程
$curChildPro--;
break;
}
}
//配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
declare(ticks=1);
//注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
pcntl_signal(SIGCHLD, "sig_handler");
//整个任务控制
for ($i = 1; $i <= 5; $i++)
//while(true)
{
$curChildPro++;
$pid = pcntl_fork();
if ($pid) //父进程运行代码
{
if ($curChildPro >= $maxChildPro)
{
pcntl_wait($status);
}
}
else //子进程运行代码
{
//子进程多次循环使用再退出
for($i =1;$i<10;$i++)
{
echo '当前进程'.$curChildPro.PHP_EOL;
echo '当前循环'.$i.PHP_EOL;
echo '占用内存'.convert(memory_get_usage()) . PHP_EOL;
sleep(1);
}
exit;
}
}
//主进程等待所有子进程完成后再退出
while ($curChildPro)
{
pcntl_wait($status);
//各信号控制冲突,造成负数循环
//$curChildPro--;
}