public function __construct(Server $server, $child = false) { $this->server = $server; $this->config = $server->getConfig(); $this->child = $child; $this->tmp_file = $server->shm_tmp_file; while (!file_exists($this->tmp_file)) { touch($this->tmp_file); chmod($this->tmp_file, $this->config['shared_memory.permissions']); } if (!$this->child) { $this->logger = $server->getLogger($this->config['log_base'] . '.SHM'); } else { $this->logger = $server->getLogger($this->config['log_base'] . '.workerSHM.' . $child); } $this->open(); }
public function __construct(Server $server, $id = false) { $this->worker_class = $server->getWorkerClass(); $this->shm = new SHM($server, $id); $this->shm->write($id, false); $this->id = $id ?: getmypid(); $this->server = $server; $this->configureLogger(); if (extension_loaded('pcntl')) { @cli_set_process_title("RMQ Worker [Master: {$server->pid}]"); } $this->configureSignals(); if (extension_loaded('pcntl')) { pcntl_signal_dispatch(); } $this->config = clone $server->config; set_error_handler([$this, "errorHandler"]); register_shutdown_function([$this, "check_for_fatal"]); $this->start(); }
private function daemonize() { $user = posix_getpwnam($this->config['user']); $group = posix_getgrnam($this->config['group']); if (!$user) { $this->logger->addEmergency("The user " . $this->config['user'] . ' could not be found'); exit(1); } elseif (!$group) { $this->logger->addEmergency('The group ' . $this->config['group'] . ' could not be found'); exit(1); } elseif ($this->config['user'] != $this->config['group'] && !in_array($user, $group['members'])) { $this->logger->addEmergency("The user " . $this->config['user'] . ' is not member of group ' . $this->config['group']); exit(1); } $this->logger->addNotice("Daemonizing Server Process"); $pid = pcntl_fork(); if ($pid) { pcntl_waitpid(-1, $status, WNOHANG); exit(0); } else { $id = posix_setsid(); if ($id < 0) { $this->logger->addCritical('Can not create new session ID'); exit(1); } posix_setuid($user['uid']); posix_setgid($group['gid']); $server = new Server($this->worker_class, true); $server->start(); exit(0); } }