最近开发一个任务管理系统,为提高任务系统的里的任务执行效率,开发主控进程,并发的执行任务,考虑公司内部的ct任务研发不可控性和管理较为复杂,决定使用php实现多进程实现任务的并发执行;
具体的测试脚本如下:
for($i=0; $i<3;$i++) { $one = $i*100+1; $two = $i*100+2; $three = $i*100+3; $idStr = $one. "," . $two . "," . $three; #$cmd = "sh /home/hao123/zhangxk.sh {$idStr}"; $pid = pcntl_fork(); if ($pid == -1) { echo "error proccess!!!"; } elseif ($pid) { continue; } else { exec("sh /home/hao123/zhangxk.sh {$idStr}"); exit(1); } }
这样可以实现子进程的脚本可以实现脚本并发了(exec是阻塞执行shell脚本的);
如果要控制子进程和父进程执行顺序那?
可以使用按如下脚本
for($i=1; $i<=5; ++$i) { $pid = pcntl_fork(); if ($pid == -1) { echo "error proccess!!!"; } elseif ($pid) { $pid=pcntl_wait($status); echo "child $status complated\n"; } else { echo "the children $i execute\n"; sleep(3); exit($i); } } echo "this is over\n";
那么父进程和其他进程怎么和子进程通信那?
for($i=1; $i<=5; ++$i) { $pid = pcntl_fork(); if ($pid == -1) { echo "error proccess!!!"; } elseif ($pid) { //$pid=pcntl_wait($status); //echo "child $status complated\n"; } else { echo "the children $i execute\n"; sleep(3); exit($i); } } echo "this is over\n"; while(pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "child $status complated\n"; }最后记录下在网上找到的一个有意思的脚本,他可以重新底层信号(ctrl+c),从而使用一个php函数实现信号执行内容:
function signalHandler($signal) { $arr = array("别费劲了,这样不行!!!", "加油再来一次", "再按一下试试", "努力努力", "靠!!!最后一次"); shuffle($arr); if ($signal == SIGINT) { echo $arr[0]. PHP_EOL; } } // 信号注册:当接收到SIGINT信号时,调用signalHandler()函数 pcntl_signal(SIGINT, 'signalHandler'); $i = 0; while (true) { if ($i==100) { break; } sleep(1); // do something pcntl_signal_dispatch(); // 接收到信号时,调用注册的signalHandler() $i++; }