Cml\Tools\Daemon\ProcessManage::demonize PHP Method

demonize() private static method

初始化守护进程
private static demonize ( )
    private static function demonize()
    {
        php_sapi_name() != 'cli' && die('should run in cli');
        umask(0);
        $pid = pcntl_fork();
        if ($pid < 0) {
            die("can't Fork!");
        } else {
            if ($pid > 0) {
                exit;
            }
        }
        if (posix_setsid() === -1) {
            //使进程成为会话组长。让进程摆脱原会话的控制;让进程摆脱原进程组的控制;
            die('could not detach');
        }
        $pid = pcntl_fork();
        if ($pid === -1) {
            die("can't fork2!");
        } elseif ($pid > 0) {
            self::message('start success!');
            exit;
        }
        defined('STDIN') && fclose(STDIN);
        defined('STDOUT') && fclose(STDOUT);
        defined('STDERR') && fclose(STDERR);
        $stdin = fopen(self::$log, 'r');
        $stdout = fopen(self::$log, 'a');
        $stderr = fopen(self::$log, 'a');
        self::setUser(self::$user);
        file_put_contents(self::$pidFile, posix_getpid()) || die("can't create pid file");
        self::setProcessName('master');
        pcntl_signal(SIGINT, ['\\' . __CLASS__, 'signalHandler'], false);
        pcntl_signal(SIGUSR1, ['\\' . __CLASS__, 'signalHandler'], false);
        file_put_contents(self::$status, '<?php return ' . var_export([], true) . ';', LOCK_EX);
        self::createChildrenProcess();
        while (true) {
            pcntl_signal_dispatch();
            $pid = pcntl_wait($status, WUNTRACED);
            pcntl_signal_dispatch();
            if ($pid > 0) {
                $status = self::getStatus();
                if (isset($status['pid'][$pid])) {
                    unset($status['pid'][$pid]);
                    file_put_contents(self::$status, '<?php return ' . var_export($status, true) . ';', LOCK_EX);
                }
                self::createChildrenProcess();
            }
            sleep(1);
        }
        return;
    }