. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\ApplicationRunners; use Espo\Core\Application\Runner; use Espo\Core\Utils\Config; use Espo\Core\Utils\Log; use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\Process; /** * Runs daemon. The daemon runs the cron more often than once a minute. */ class Daemon implements Runner { use Cli; public function __construct(private Config $config, private Log $log) {} public function run(): void { $maxProcessNumber = $this->config->get('daemonMaxProcessNumber'); $interval = $this->config->get('daemonInterval'); $timeout = $this->config->get('daemonProcessTimeout'); $phpExecutablePath = $this->config->get('phpExecutablePath'); if (!$phpExecutablePath) { $phpExecutablePath = (new PhpExecutableFinder)->find(); } if (!$maxProcessNumber || !$interval) { $this->log->error("Daemon config params are not set."); return; } $processList = []; while (true) { /** @phpstan-ignore-line */ $toSkip = false; $runningCount = 0; foreach ($processList as $i => $process) { if ($process->isRunning()) { $runningCount++; } else { unset($processList[$i]); } } $processList = array_values($processList); if ($runningCount >= $maxProcessNumber) { $toSkip = true; } if (!$toSkip) { $process = new Process([$phpExecutablePath, 'cron.php']); $process->setTimeout($timeout); $process->start(); $processList[] = $process; } sleep($interval); } } }