queue = new PriorityQueue(); } public function dispatch(Job $job) { $this->queue->insert($job, $job->getPriority()); } public function run() { $this->run = true; $this->suspended = false; if ($this->isDeamonized) { if ($pid = pcntl_fork()) { return $pid; } $this->runAsDeamon(); if (posix_setsid() < 0 || $pid = pcntl_fork()) { return 0; } } while ($this->run) { while (!$this->suspended) { if ($this->deamonized) { // todo: see if still unsuspended and still running (db, file etc) } } $job = $this->queue->pop(); $this->queue->increaseAll(); $job['job']->execute(); if ($this->isTerminating && $this->queue->count() < 1) { $this->suspended = true; $this->run = false; } sleep(1); } sleep(1); return -1; } private function runAsDeamon() { ob_end_clean(); fclose(STDIN); fclose(STDOUT); fclose(STDERR); register_shutdown_function(function() { posix_kill(posix_getpid(), SIGHUP); }); } public function setRunning(bool $run = true) /* : void */ { $this->run = $run; $this->suspended = $run; } public function isRunning() : bool { return $this->run; } public function isSuspended() : bool { return $this->suspended; } public function setSuspended(bool $suspended = true) /* : void */ { $this->suspended = $suspended; } public function isTerminating() : bool { return $this->isTerminating; } public function setTerminating(bool $terminating = true) /* : void */ { $this->isTerminating = $terminating; } public function isDeamonized() : bool { return $this->isDeamonized; } public function setDeamonized(bool $deamonized) /* : void */ { $this->isDeamonized = $deamonized; } private function savePid() { // todo: save pid somewhere for kill } }