1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau/* 4*04fd306cSNickeau * This file is part of the Symfony package. 5*04fd306cSNickeau * 6*04fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com> 7*04fd306cSNickeau * 8*04fd306cSNickeau * For the full copyright and license information, please view the LICENSE 9*04fd306cSNickeau * file that was distributed with this source code. 10*04fd306cSNickeau */ 11*04fd306cSNickeau 12*04fd306cSNickeaunamespace Symfony\Component\Process; 13*04fd306cSNickeau 14*04fd306cSNickeauuse Symfony\Component\Process\Exception\LogicException; 15*04fd306cSNickeauuse Symfony\Component\Process\Exception\RuntimeException; 16*04fd306cSNickeau 17*04fd306cSNickeau/** 18*04fd306cSNickeau * PhpProcess runs a PHP script in an independent process. 19*04fd306cSNickeau * 20*04fd306cSNickeau * $p = new PhpProcess('<?php echo "foo"; ?>'); 21*04fd306cSNickeau * $p->run(); 22*04fd306cSNickeau * print $p->getOutput()."\n"; 23*04fd306cSNickeau * 24*04fd306cSNickeau * @author Fabien Potencier <fabien@symfony.com> 25*04fd306cSNickeau */ 26*04fd306cSNickeauclass PhpProcess extends Process 27*04fd306cSNickeau{ 28*04fd306cSNickeau /** 29*04fd306cSNickeau * @param string $script The PHP script to run (as a string) 30*04fd306cSNickeau * @param string|null $cwd The working directory or null to use the working dir of the current PHP process 31*04fd306cSNickeau * @param array|null $env The environment variables or null to use the same environment as the current PHP process 32*04fd306cSNickeau * @param int $timeout The timeout in seconds 33*04fd306cSNickeau * @param array|null $php Path to the PHP binary to use with any additional arguments 34*04fd306cSNickeau */ 35*04fd306cSNickeau public function __construct(string $script, string $cwd = null, array $env = null, int $timeout = 60, array $php = null) 36*04fd306cSNickeau { 37*04fd306cSNickeau if (null === $php) { 38*04fd306cSNickeau $executableFinder = new PhpExecutableFinder(); 39*04fd306cSNickeau $php = $executableFinder->find(false); 40*04fd306cSNickeau $php = false === $php ? null : array_merge([$php], $executableFinder->findArguments()); 41*04fd306cSNickeau } 42*04fd306cSNickeau if ('phpdbg' === \PHP_SAPI) { 43*04fd306cSNickeau $file = tempnam(sys_get_temp_dir(), 'dbg'); 44*04fd306cSNickeau file_put_contents($file, $script); 45*04fd306cSNickeau register_shutdown_function('unlink', $file); 46*04fd306cSNickeau $php[] = $file; 47*04fd306cSNickeau $script = null; 48*04fd306cSNickeau } 49*04fd306cSNickeau 50*04fd306cSNickeau parent::__construct($php, $cwd, $env, $script, $timeout); 51*04fd306cSNickeau } 52*04fd306cSNickeau 53*04fd306cSNickeau /** 54*04fd306cSNickeau * {@inheritdoc} 55*04fd306cSNickeau */ 56*04fd306cSNickeau public static function fromShellCommandline(string $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60) 57*04fd306cSNickeau { 58*04fd306cSNickeau throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); 59*04fd306cSNickeau } 60*04fd306cSNickeau 61*04fd306cSNickeau /** 62*04fd306cSNickeau * {@inheritdoc} 63*04fd306cSNickeau */ 64*04fd306cSNickeau public function start(callable $callback = null, array $env = []) 65*04fd306cSNickeau { 66*04fd306cSNickeau if (null === $this->getCommandLine()) { 67*04fd306cSNickeau throw new RuntimeException('Unable to find the PHP executable.'); 68*04fd306cSNickeau } 69*04fd306cSNickeau 70*04fd306cSNickeau parent::start($callback, $env); 71*04fd306cSNickeau } 72*04fd306cSNickeau} 73