php多进程


        ini_set('memory_limit', '-1');
        $files = Finance::getFiles($dir);
        if($files){
            foreach ($files as $k =>$file){
                $nPID = pcntl_fork(); // 创建子进程

                if($nPID == 0){
                    try{
                       //业务处理
                    }catch (\Exception $e){
                        echo "子进程错误"."\n";
                        $masterpid = posix_getpid();
                        exec("kill -9 ".$masterpid."");
                        exit();
                    }

                    exit(0); // 执行完后退出
                }

            }
        }


/* 确保这个函数只能运行在SHELL中 */
if (substr(php_sapi_name(), 0, 3) !== 'cli') {
    die("cli mode only");
}
//cli_set_process_title("我是父进程,我的进程id是{$ppid}.");
//简单的子进程
$ppid = posix_getpid();
echo "我也不知道现在是什么进程,现在进程id是{$ppid}\n";
$pid = pcntl_fork();
echo "fork了一个进程,返回值是{$pid}\n";
if ($pid == -1) {
    throw new Exception('fork子进程失败!');
} elseif ($pid > 0) {
    echo "我是父进程,我的进程id是{$ppid}\n";
    sleep(5); // 保持30秒,确保能被ps查到
} else {
    $cpid = posix_getpid();
    echo "我是{$ppid}的子进程,我的进程id是{$cpid}\n";
    sleep(5);
}
 
//执行结果
/*我也不知道现在是什么进程,现在进程id是2330
fork了一个进程,返回值是2331
我是父进程,我的进程id是2330
fork了一个进程,返回值是0
我是2330的子进程,我的进程id是2331*/
 
 
//三个子进程任务处理
shell_exec('split -1 2500,-d file.lo prefix_name');
for ($i=1;$i<=3;$i++)
{
    $pid = pcntl_fork();
    if($pid == -1){
        die("could not work");
    }elseif($pid){
        echo "I am 父进程 $i \n";
    }else{
        $cpid = posix_getpid();
        echo "我是子进程$i===子进程id是===$cpid \n";
        exit;
    }
}
//等待子进程结束
while (pcntl_waitpid(0,$status) != -1){
    $status  = pcntl_wexitstatus($status);
    echo "Child $status completed\n";
}
//执行结果
/*split: extra operand ‘prefix_name’
Try 'split --help' for more information.
I am 父进程 1
我是子进程1===子进程id是===2416
I am 父进程 2
我是子进程2===子进程id是===2417
I am 父进程 3
我是子进程3===子进程id是===2418
Child 0 completed
Child 0 completed
Child 0 completed*/

推荐阅读更多精彩内容