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;
}