PHP 使用pcntl实现守护进程

本文详细介绍了使用PHP创建守护进程的具体实现过程,包括父进程、子进程的创建与管理,以及如何脱离用户终端控制,成为后台运行的守护进程。通过代码示例,展示了如何控制子进程数量,处理子进程异常,以及记录日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

declare(ticks=1);
$top_pid = pcntl_fork();
// 结束父进程,子进程继续执行
if ($top_pid) {
	exit();
}
// 子进程脱离用户终端控制,成为新的会话组长
posix_setsid();

// 防止会话组长重新打开控制终端,再次创建子进程,并退出当前进程
$new_pid = pcntl_fork();
if ($new_pid) {
	exit();
}
chdir('/') && umask(0);
$workers = array();
while (true) {
	while (count($workers) >= 3) {
        $child_pid = pcntl_wait($status);
		if ($child_pid < 0) {
			file_put_contents('/tmp/error.log', 'error_no:'.$status.';error_msg:'.pcntl_get_last_error());
		}else{
            $index = array_search($child_pid, $workers);
            unset($workers[$index]);
        }       
	}
	$pid = pcntl_fork();
	if ($pid) {
		$workers[]=$pid;
        continue;
	}
    // 子进程执行
    sleep(20);
    file_put_contents('/tmp/daemon.log', date('Y-m-d H:i:s').json_encode($workers).PHP_EOL,FILE_APPEND);
    exit(0);   
}

转载于:https://my.oschina.net/gzheng/blog/1533670

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值