xref: /plugin/combo/vendor/symfony/process/PhpProcess.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*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