企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
fork进程实例 $ppid = posix_getpid(); $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败!'); } elseif ($pid > 0) { cli_set_process_title("我是父进程,我的进程id是{$ppid}.");      sleep(30); // 保持30秒,确保能被ps查到 } else { $cpid = posix_getpid(); cli_set_process_title("我是{$ppid}的子进程,我的进程id是{$cpid}."); sleep(30); } 分发信号处理器 我们通过在父进程接收子进程传来的信号,判断子进程状态,来对子进程进行管理。 我们需要在父进程里使用pcntl_signal()函数和pcntl_signal_dispatch()函数来给各个子进程安装信号处理器。 pcntl_signal (int $signo , callback $handler) 安装一个信号处理器; $signo是待处理的信号常量,callback是其处理函数 pcntl_signal_dispatch () 调用每个等待信号通过pcntl_signal()安装的处理器 PHP内常见的信号常量有: SIGCHLD 子进程退出成为僵尸进程会向父进程发送此信号 SIGHUP 进程挂起 SIGTEM 进程终止 ... // 其他请在手册中查看 处理子进程 对子进程的处理方法有: posix_kill():此函数并不能顾名思义,它通过向子进程发送一个信号来操作子进程,在需要要时可以选择给子进程发送进程终止信号来终止子进程; pcntl_waitpid():等待或返回fork的子进程状态,如果指定的子进程在此函数调用时已经退出(俗称僵尸进程),此函数将立刻返回,并释放子进程的所有系统资源,此进程可以避免子进程变成僵尸进程,造成系统资源浪费; 下面是两个函数的函数原型: bool posix_kill ( int $pid , int $sig ) // 向进程id为$pid的进程发送$sig信号,$sig常见信号如上; int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] ) // 挂起当前进程的执行直到进程号为$pid的进程退出(如果$pid为-1,则等待任意一个子进程);