最近开发一个任务管理系统,为提高任务系统的里的任务执行效率,开发主控进程,并发的执行任务,考虑公司内部的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++;
}
本文介绍了一个基于PHP的任务管理系统中多进程的实现方法。通过使用pcntl扩展,文章演示了如何创建并发执行的任务子进程,包括控制子进程执行顺序、父进程与子进程之间的通信以及如何处理信号中断。
2107

被折叠的 条评论
为什么被折叠?



