$stream) { if ($stream === $sock) { $newid = $id; } } $_on_connect($newid, $host, $port); }; $_disconnect = function($id) use (&$_iostreams, &$_on_disconnect) { $_on_disconnect($id); fclose($_iostreams[$id]); unset($_iostreams[$id]); }; $_write = function($id, $output) use (&$_iostreams, &$_stream_fwrite, &$_on_output) { $_on_output($id, $output); $_stream_fwrite($_iostreams[$id], $output); }; $_loop = function() use (&$_iostreams, &$_plugins, &$_disconnect, &$_on_input, &$_reload) { while (true) { if ($_reload()) return; if (count($_iostreams) == 0) exit; $r = $_iostreams; $w = []; $e = []; @stream_select($r, $w, $e, null); foreach ($r as $instream) { $inid = 0; foreach ($_iostreams as $id => $stream) { if ($stream === $instream) { $inid = $id; } } if (feof($instream)) { $_disconnect($inid); } else { $read = []; while (true) { $line = rtrim(fgets($instream)); if ($line == '') break; $read[] = $line; } foreach ($read as $line) { $_on_input($inid, $line); } } } } }; // Reload code when appropriate signal is received $_sig_handler = function($signo) use (&$_reload) { echo 'Got SIGUSR1, scheduling reload...', PHP_EOL; $_reload(true); }; pcntl_signal(SIGUSR1, $_sig_handler);