php 多进程开发学习笔记

        最近开发一个任务管理系统,为提高任务系统的里的任务执行效率,开发主控进程,并发的执行任务,考虑公司内部的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++;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值