umask(0);
for ($i = 1; $i <= $processNum; $i++) {
$pid = pcntl_fork();
if ($pid > 0) { // 在父进程中
cli_set_process_title($className);
pcntl_waitpid($pid, $status, WNOHANG);
// 给父进程安装一个SIGCHLD信号处理器
pcntl_signal(SIGCHLD, static function () use ($pid) {
pcntl_waitpid($pid, $status, WNOHANG);
});
// 父进程不断while循环,去反复执行pcntl_waitpid(),从而试图解决已经退出的子进程
while (true) {
pcntl_signal_dispatch();
}
} elseif (0 === $pid) {
while (true) {
echo 'process ts1 ' . Carbon::now()->toDateTimeString().PHP_EOL;
sleep(1);
}
}
}
目前我是这么实现的
1: 这里为什么要处理回收子进程呢,不是在下面已经while(1){pcntl_signal_dispatch(); }了吗
2: 目前看来只要子进程的数量会随着报错而减少,我觉得应该在pcntl_signal信号注册中判断下子进程数量,新开维持或者当子进程全部退光,主进程就关闭
哦,我这里是不会报错的,我是框架里复制过来的 demo , 框架中用了 Carbon 包
我的意思是 说,你不是想在子进程中执行任务吗,你这种写法子进程如果不报错就会是固定数量定时运行,如果报错一个子进程就少一个
嗯 理解
如果真的想了解简单的多进程模型,https://hu60.cn/q.php/bbs.topic.102668.html
https://file.hu60.cn/file/hash/png/ebc5ef33ec34e98dec73089c262d925b818701.png
帖子 id=102668 没有访问权限!
打篮球的路过