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*04fd306cSNickeau/** 15*04fd306cSNickeau * An executable finder specifically designed for the PHP executable. 16*04fd306cSNickeau * 17*04fd306cSNickeau * @author Fabien Potencier <fabien@symfony.com> 18*04fd306cSNickeau * @author Johannes M. Schmitt <schmittjoh@gmail.com> 19*04fd306cSNickeau */ 20*04fd306cSNickeauclass PhpExecutableFinder 21*04fd306cSNickeau{ 22*04fd306cSNickeau private $executableFinder; 23*04fd306cSNickeau 24*04fd306cSNickeau public function __construct() 25*04fd306cSNickeau { 26*04fd306cSNickeau $this->executableFinder = new ExecutableFinder(); 27*04fd306cSNickeau } 28*04fd306cSNickeau 29*04fd306cSNickeau /** 30*04fd306cSNickeau * Finds The PHP executable. 31*04fd306cSNickeau * 32*04fd306cSNickeau * @return string|false 33*04fd306cSNickeau */ 34*04fd306cSNickeau public function find(bool $includeArgs = true) 35*04fd306cSNickeau { 36*04fd306cSNickeau if ($php = getenv('PHP_BINARY')) { 37*04fd306cSNickeau if (!is_executable($php)) { 38*04fd306cSNickeau $command = '\\' === \DIRECTORY_SEPARATOR ? 'where' : 'command -v'; 39*04fd306cSNickeau if ($php = strtok(exec($command.' '.escapeshellarg($php)), \PHP_EOL)) { 40*04fd306cSNickeau if (!is_executable($php)) { 41*04fd306cSNickeau return false; 42*04fd306cSNickeau } 43*04fd306cSNickeau } else { 44*04fd306cSNickeau return false; 45*04fd306cSNickeau } 46*04fd306cSNickeau } 47*04fd306cSNickeau 48*04fd306cSNickeau if (@is_dir($php)) { 49*04fd306cSNickeau return false; 50*04fd306cSNickeau } 51*04fd306cSNickeau 52*04fd306cSNickeau return $php; 53*04fd306cSNickeau } 54*04fd306cSNickeau 55*04fd306cSNickeau $args = $this->findArguments(); 56*04fd306cSNickeau $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; 57*04fd306cSNickeau 58*04fd306cSNickeau // PHP_BINARY return the current sapi executable 59*04fd306cSNickeau if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { 60*04fd306cSNickeau return \PHP_BINARY.$args; 61*04fd306cSNickeau } 62*04fd306cSNickeau 63*04fd306cSNickeau if ($php = getenv('PHP_PATH')) { 64*04fd306cSNickeau if (!@is_executable($php) || @is_dir($php)) { 65*04fd306cSNickeau return false; 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau return $php; 69*04fd306cSNickeau } 70*04fd306cSNickeau 71*04fd306cSNickeau if ($php = getenv('PHP_PEAR_PHP_BIN')) { 72*04fd306cSNickeau if (@is_executable($php) && !@is_dir($php)) { 73*04fd306cSNickeau return $php; 74*04fd306cSNickeau } 75*04fd306cSNickeau } 76*04fd306cSNickeau 77*04fd306cSNickeau if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) { 78*04fd306cSNickeau return $php; 79*04fd306cSNickeau } 80*04fd306cSNickeau 81*04fd306cSNickeau $dirs = [\PHP_BINDIR]; 82*04fd306cSNickeau if ('\\' === \DIRECTORY_SEPARATOR) { 83*04fd306cSNickeau $dirs[] = 'C:\xampp\php\\'; 84*04fd306cSNickeau } 85*04fd306cSNickeau 86*04fd306cSNickeau return $this->executableFinder->find('php', false, $dirs); 87*04fd306cSNickeau } 88*04fd306cSNickeau 89*04fd306cSNickeau /** 90*04fd306cSNickeau * Finds the PHP executable arguments. 91*04fd306cSNickeau * 92*04fd306cSNickeau * @return array 93*04fd306cSNickeau */ 94*04fd306cSNickeau public function findArguments() 95*04fd306cSNickeau { 96*04fd306cSNickeau $arguments = []; 97*04fd306cSNickeau if ('phpdbg' === \PHP_SAPI) { 98*04fd306cSNickeau $arguments[] = '-qrr'; 99*04fd306cSNickeau } 100*04fd306cSNickeau 101*04fd306cSNickeau return $arguments; 102*04fd306cSNickeau } 103*04fd306cSNickeau} 104