params->shift('forever'); if (! $forever && $this->params->getStandalone() === 'forever') { $forever = true; $this->params->shift(); } $jobId = $this->params->shift(); if ($jobId) { $this->raiseLimits(); $job = DirectorJob::load($jobId, $this->db()); $job->run(); exit(0); } if ($forever) { $this->runforever(); } else { $this->runAllPendingJobs(); } } protected function runforever() { // We'll terminate ourselves after 24h for now: $runUnless = time() + 86400; // We'll exit in case more than 100MB of memory are still in use // after the last job execution: $maxMem = 100 * 1024 * 1024; while (true) { $this->runAllPendingJobs(); if (memory_get_usage() > $maxMem) { exit(0); } if (time() > $runUnless) { exit(0); } sleep(2); } } protected function runAllPendingJobs() { $jobs = new JobRunner($this->db()); try { if ($this->hasBeenDisabled()) { return; } $jobs->runPendingJobs(); } catch (Exception $e) { Logger::error('Director Job Error: ' . $e->getMessage()); sleep(10); } } protected function hasBeenDisabled() { return $this->db()->settings()->disable_all_jobs === 'y'; } }