xref: /plugin/combo/vendor/symfony/process/PhpExecutableFinder.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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