104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeau/* 404fd306cSNickeau * This file is part of the Symfony package. 504fd306cSNickeau * 604fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com> 704fd306cSNickeau * 804fd306cSNickeau * For the full copyright and license information, please view the LICENSE 904fd306cSNickeau * file that was distributed with this source code. 1004fd306cSNickeau */ 1104fd306cSNickeau 1204fd306cSNickeaunamespace Symfony\Component\Process; 1304fd306cSNickeau 1404fd306cSNickeau/** 1504fd306cSNickeau * An executable finder specifically designed for the PHP executable. 1604fd306cSNickeau * 1704fd306cSNickeau * @author Fabien Potencier <fabien@symfony.com> 1804fd306cSNickeau * @author Johannes M. Schmitt <schmittjoh@gmail.com> 1904fd306cSNickeau */ 2004fd306cSNickeauclass PhpExecutableFinder 2104fd306cSNickeau{ 2204fd306cSNickeau private $executableFinder; 2304fd306cSNickeau 2404fd306cSNickeau public function __construct() 2504fd306cSNickeau { 2604fd306cSNickeau $this->executableFinder = new ExecutableFinder(); 2704fd306cSNickeau } 2804fd306cSNickeau 2904fd306cSNickeau /** 3004fd306cSNickeau * Finds The PHP executable. 3104fd306cSNickeau * 3204fd306cSNickeau * @return string|false 3304fd306cSNickeau */ 3404fd306cSNickeau public function find(bool $includeArgs = true) 3504fd306cSNickeau { 3604fd306cSNickeau if ($php = getenv('PHP_BINARY')) { 3704fd306cSNickeau if (!is_executable($php)) { 38*83c68632SNico $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v --'; 3904fd306cSNickeau if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) { 4004fd306cSNickeau if (!is_executable($php)) { 4104fd306cSNickeau return false; 4204fd306cSNickeau } 4304fd306cSNickeau } else { 4404fd306cSNickeau return false; 4504fd306cSNickeau } 4604fd306cSNickeau } 4704fd306cSNickeau 4804fd306cSNickeau if (@is_dir($php)) { 4904fd306cSNickeau return false; 5004fd306cSNickeau } 5104fd306cSNickeau 5204fd306cSNickeau return $php; 5304fd306cSNickeau } 5404fd306cSNickeau 5504fd306cSNickeau $args = $this->findArguments(); 5604fd306cSNickeau $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; 5704fd306cSNickeau 5804fd306cSNickeau // PHP_BINARY return the current sapi executable 59*83c68632SNico if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cli', 'cli-server', 'phpdbg'], true)) { 6004fd306cSNickeau return \PHP_BINARY.$args; 6104fd306cSNickeau } 6204fd306cSNickeau 6304fd306cSNickeau if ($php = getenv('PHP_PATH')) { 6404fd306cSNickeau if (!@is_executable($php) || @is_dir($php)) { 6504fd306cSNickeau return false; 6604fd306cSNickeau } 6704fd306cSNickeau 6804fd306cSNickeau return $php; 6904fd306cSNickeau } 7004fd306cSNickeau 7104fd306cSNickeau if ($php = getenv('PHP_PEAR_PHP_BIN')) { 7204fd306cSNickeau if (@is_executable($php) && !@is_dir($php)) { 7304fd306cSNickeau return $php; 7404fd306cSNickeau } 7504fd306cSNickeau } 7604fd306cSNickeau 7704fd306cSNickeau if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) { 7804fd306cSNickeau return $php; 7904fd306cSNickeau } 8004fd306cSNickeau 8104fd306cSNickeau $dirs = [\PHP_BINDIR]; 8204fd306cSNickeau if ('\\' === \DIRECTORY_SEPARATOR) { 8304fd306cSNickeau $dirs[] = 'C:\xampp\php\\'; 8404fd306cSNickeau } 8504fd306cSNickeau 8604fd306cSNickeau return $this->executableFinder->find('php', false, $dirs); 8704fd306cSNickeau } 8804fd306cSNickeau 8904fd306cSNickeau /** 9004fd306cSNickeau * Finds the PHP executable arguments. 9104fd306cSNickeau * 9204fd306cSNickeau * @return array 9304fd306cSNickeau */ 9404fd306cSNickeau public function findArguments() 9504fd306cSNickeau { 9604fd306cSNickeau $arguments = []; 9704fd306cSNickeau if ('phpdbg' === \PHP_SAPI) { 9804fd306cSNickeau $arguments[] = '-qrr'; 9904fd306cSNickeau } 10004fd306cSNickeau 10104fd306cSNickeau return $arguments; 10204fd306cSNickeau } 10304fd306cSNickeau} 104