用php实现一个简单的守护进程,多进程

首先我们要知道创建守护进程的五个步骤:

  1. 创建子进程,终止父进程
  2. 在子进程中创建新会话
  3. 改变工作目录(默认继承了父进程的当前工作目录)
  4. 重设文件创建掩码(默认继承了父进程的文件创建掩码)
  5. 关闭文件描述符(默认继承了父进程打开了的文件)

还要安装有pcntl扩展,可通过php -m查看是否安装

然后直接上代码

<?php

function daemon() {
    // fork一个子进程
    $pid = pcntl_fork();

	//判断$pid
    switch ($pid) {
    case -1:
        die('fork失败');
        break;
    case 0:
        // 这里是子进程执行的代码

        // 创建新会话
        if ( ($sid = posix_setsid()) <= 0 ) {
            die("创建失败\n");
        }

        // 3.改变工作目录
        if (chdir('/') === false) {
            die("改变工作目录失败\n");
        }

        // 4.重设文件创建掩码
        umask(0);

        // 5.关闭文件描述符
        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);

        break;
    default:
        // 这里是父进程执行的代码  直接退出即可
        exit;
        break;
    }
}

//fork子进程
function fork() {
    global $childs;

	//fork子进程
    $pid = pcntl_fork();

    switch ($pid) {
    case -1:
        die('fork失败');
        break;
    case 0:
        // 这里是子进程执行的代码
        while (true) {
            sleep(5);
        }

        break;
    default:
        // 这里是父进程执行的代码 ,将fork的子进程id 放入全局变量$childs中
        $childs[$pid] = $pid;
        break;
    }
}
//创建守护进程
daemon();
//定义全局变量
$childs = [];
//需要fork的子进程数,这里创建3个子进程
$count = 3;
//循环创建子进程
for ($i = 0; $i < $count; $i++) {
    fork();
}
//这里判断 当子进程的数量大于0 的时候 等待子进程的退出,并重新fork新的子进程
while ( count($childs) ) {
    if ( ($exit_id = pcntl_wait($status)) > 0 ) {
        unset($childs[$exit_id]);
    }

    if ( count($childs) < 3 ) {
        fork();
    }
}

需要注意的是守护进程不能有输出
需要注意的是守护进程不能有输出
需要注意的是守护进程不能有输出

至此,一个简单的守护进程就创建好了,还有三个子进程,每当子进程出现问题退出后,都会重新创建一个子进程来代替

可以结合控制信号,给脚本start|stop|reload等参数来实现更加便捷化的操作

是不是很简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值