public static function run() { declare (ticks=1); pcntl_signal(SIGCHLD, array('Octave_daemon', 'deadChild')); pcntl_signal(SIGTERM, array('Octave_daemon', 'kill')); while (true) { foreach (self::$servers as $server) { while ($sock = $server->accept_connection()) { Octave_pool::newConnection($sock); } Octave_pool::manageConnections(); } usleep(1000); } }
public static function manageConnections() { $still_waiting = array(); foreach (self::$pending_connections as $cSocket) { if ($kid =& self::getChild($cSocket)) { $pid = pcntl_fork(); if ($pid == -1) { Octave_logger::log("Failed forking!", LOG_ERR); exit; } elseif ($pid) { // Parent Octave_daemon::$child_pids[$pid] = true; $kid->pid = $pid; $kid->close(); } else { // Child Octave_daemon::childMode(); chdir(self::$home_directory); $kid->entertain(); $kid->killSocket(); exit; } } else { $still_waiting[] = $cSocket; } } self::$pending_connections = $still_waiting; }