已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 源码

标题: PHP操作多进程处理,并且deamon守护。PHP视角流程图

作者: @Ta

时间: 2022-03-02发布,2022-03-02修改

点击: 1584

未命名文件.png
<?php
$childs = [];


function daemon()
{
    $pid = pcntl_fork();
    if ($pid < 0) {
        exit('错误无法创建');
    }
    //子进程执行
    if ($pid == 0) {
        echo sprintf('deamon子进程逻辑开始执行') . PHP_EOL;
        //2.让子进程会话变成主会话
        $sid=posix_setsid();
        if($sid<=0){
            echo('set fail');
        }
        //3.修改工作目录
        if(chdir('/')===false){
            echo('fail to change dir ');
        }
        //4.与chmod相反 默认继承了父进程的文件创建掩码
        umask(0);
        echo '子进程已经成为deamon'.PHP_EOL;
        //5.默认继承了父进程打开的文件,关闭后面子进程的输出输入linux终端
        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);
    }
    //父进程执行
    if ($pid > 0) {
       // 第一步
        exit('父进程('.posix_getpid().')退出'.PHP_EOL);
    }
}


function fork()
{
    $pid = pcntl_fork();
    if ($pid < 0)   exit('错误无法创建');
    //子进程执行
    if ($pid == 0) {
        echo sprintf('子进程(%s)被创建', posix_getpid()) . PHP_EOL;
        //子进程永远阻塞这里,可以是业务代码
        while (true) {
            sleep(10);
        }
    }
    //父进程执行,保留子进程的pid
    if ($pid > 0) {
        global $childs;
        $childs[$pid] = $pid;
    }
}

//上面代码,定义 funciont damon() ; function fork()
//父进程退出,子进程接管
daemon();

for ($i=0;$i<3;$i++){
    fork();
}

echo '子进程为(' . posix_getpid() . ')已经升级为父进程' . PHP_EOL;
echo '开始作为deamon守护';
while (count($childs)) {
    $exit_id = pcntl_wait($status);
    if ($exit_id >= 0) {
        $msg = pcntl_wtermsig($status);
        //删除数组资源句柄
        echo sprintf('子进程:(%s) 退出,原因:%s', $exit_id, $msg) . PHP_EOL;
        unset($childs[$exit_id]);
    }
    //monitor 监控子进程
    //子进程数量不足2个,就fork()创建子进程
    if (count($childs) < 2) {
        fork();
    }
}


[隐藏样式|查看源码]


『回复列表(2|隐藏机器人聊天)』

1.
wps需要VIP才能导出pos源文件和高清图,非会员内容只能保存云端。

image.png
(/@Ta/2022-03-02 13:24//)

2. 额,你最近在学习这些协议,进程啥的嘛?
(/@Ta/2022-03-02 13:56//)

回复需要登录

7月3日 11:54 星期四

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1