前提:此命令在windows平台上不可用,且最好是在cli(命令行)下运行(ps:宝塔默认禁用pcntl_fork()函数)。

需要用到pcntl_fork()函数,此函数创建一个子进程,父进程和子进程都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。

const NEWLINE = "\n\n";
if (strtolower(php_sapi_name()) != 'cli') {
    die("请在cli模式下运行");
}
echo "当前进程(执行fork前):" . getmypid() . NEWLINE;
//fork出子进程
$pid = pcntl_fork(); 
//fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立
if ($pid == -1) { // 创建错误,返回-1

    die('进程fork失败');
} else if ($pid) { // $pid > 0, 如果fork成功,在子进程中pid为0,而父进程中pid则大于0。

    // 父进程逻辑
    $time = microtime(true);
    $thispid=getmypid();
    echo "{$thispid}-{$pid}-我是父进程:{$time}".NEWLINE;

} else { // $pid = 0

    // 子进程逻辑
    $time = microtime(true);
    $thispid=getmypid();
    echo "{$thispid}-{$pid}-我是子进程-{$pid}:{$time}".NEWLINE;
}

补充:getmypid()获取当前进程id。