/** * Check that we have a correct CLI executable of PHP. * * @return void */ public function doTest() { $this->setMessage('Check if PHP may spawn processes.'); if (!FunctionAvailabilityCheck::isFunctionDefined('proc_open')) { $this->markFailed('The process execution relies on proc_open, which is not available on your PHP installation.'); return; } if (FunctionAvailabilityCheck::isFunctionBlacklistedInSuhosin('proc_open')) { $this->markFailed('The process execution relies on proc_open, which is disabled in Suhosin on your PHP installation. ' . 'Please remove "proc_open" from "suhosin.executor.func.blacklist" in php.ini'); return; } if (FunctionAvailabilityCheck::isFunctionBlacklistedInPhpIni('proc_open')) { $this->markFailed('The process execution relies on proc_open, which is disabled in your PHP installation. ' . 'Please remove "proc_open" from "disabled_functions" in php.ini'); return; } $this->markSuccess(); }
/** * Try to fork. * * The return value determines if the caller shall exit (when forking was successful and it is the forking process) * or rather proceed execution (is the fork or unable to fork). * * True means exit, false means go on in this process. * * @return bool * * @throws \RuntimeException When the forking caused an error. */ private function fork() { /** @var LoggerInterface $logger */ $logger = $this->getContainer()->get('logger'); if (!$this->getContainer()->get('tenside.config')->isForkingAvailable()) { $logger->warning('Forking disabled by configuration, execution will block until the command has finished.'); return false; } elseif (!FunctionAvailabilityCheck::isFunctionEnabled('pcntl_fork', 'pcntl')) { $logger->warning('pcntl_fork() is not available, execution will block until the command has finished.'); return false; } else { $pid = pcntl_fork(); if (-1 === $pid) { throw new \RuntimeException('pcntl_fork() returned -1.'); } elseif (0 !== $pid) { // Tell the calling method to exit now. $logger->info('Forked process ' . posix_getpid() . ' to pid ' . $pid); return true; } $logger->info('Processing task in forked process with pid ' . posix_getpid()); return false; } }