版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zchqq/article/details/82905216
需在linux环境执行
/* 确保这个函数只能运行在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*/
demo.php的内容 write_log1.php的内容 log.txt的内容