Skip to content

[2.3][Process] fix Proccess run with pts enabled #16510

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 32 additions & 19 deletions src/Symfony/Component/Process/Process.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,12 @@ class Process
/**
* Constructor.
*
* @param string $commandline The command line to run
* @param string|null $cwd The working directory or null to use the working dir of the current PHP process
* @param array|null $env The environment variables or null to inherit
* @param string|null $stdin The STDIN content
* @param integer|float|null $timeout The timeout in seconds or null to disable
* @param array $options An array of options for proc_open
* @param string $commandline The command line to run
* @param string|null $cwd The working directory or null to use the working dir of the current PHP process
* @param array|null $env The environment variables or null to inherit
* @param string|null $stdin The STDIN content
* @param int|float|null $timeout The timeout in seconds or null to disable
* @param array $options An array of options for proc_open
*
* @throws RuntimeException When proc_open is not installed
*
Expand Down Expand Up @@ -184,7 +184,7 @@ public function __clone()
* @param callback|null $callback A PHP callback to run whenever there is some
* output available on STDOUT or STDERR
*
* @return integer The exit status code
* @return int The exit status code
*
* @throws RuntimeException When process can't be launch or is stopped
*
Expand Down Expand Up @@ -238,8 +238,20 @@ public function start($callback = null)
}
}

$ptsWorkaround = null;

if (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
// Workaround for the bug, when PTS functionality is enabled.
// @see : https://bugs.php.net/69442
$ptsWorkaround = fopen('php://fd/0', 'r');
}

$this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options);

if ($ptsWorkaround) {
fclose($ptsWorkaround);
}

if (!is_resource($this->process)) {
throw new RuntimeException('Unable to launch a new process.');
}
Expand Down Expand Up @@ -287,7 +299,7 @@ public function restart($callback = null)
*
* @param callback|null $callback A valid PHP callback
*
* @return integer The exitcode of the process
* @return int The exitcode of the process
*
* @throws RuntimeException When process timed out
* @throws RuntimeException When process stopped after receiving signal
Expand All @@ -302,7 +314,7 @@ public function wait($callback = null)
do {
$this->checkTimeout();
$running = defined('PHP_WINDOWS_VERSION_BUILD') ? $this->isRunning() : $this->processPipes->hasOpenHandles();
$close = !defined('PHP_WINDOWS_VERSION_BUILD') || !$running;;
$close = !defined('PHP_WINDOWS_VERSION_BUILD') || !$running;
$this->readPipes(true, $close);
} while ($running);

Expand All @@ -324,7 +336,7 @@ public function wait($callback = null)
/**
* Returns the Pid (process identifier), if applicable.
*
* @return integer|null The process id if running, null otherwise
* @return int|null The process id if running, null otherwise
*
* @throws RuntimeException In case --enable-sigchild is activated
*/
Expand All @@ -342,7 +354,8 @@ public function getPid()
/**
* Sends a posix signal to the process.
*
* @param integer $signal A valid posix signal (see http://www.php.net/manual/en/pcntl.constants.php)
* @param int $signal A valid posix signal (see http://www.php.net/manual/en/pcntl.constants.php)
*
* @return Process
*
* @throws LogicException In case the process is not running
Expand Down Expand Up @@ -434,7 +447,7 @@ public function getIncrementalErrorOutput()
/**
* Returns the exit code returned by the process.
*
* @return integer The exit status code
* @return int The exit status code
*
* @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
*
Expand Down Expand Up @@ -508,7 +521,7 @@ public function hasBeenSignaled()
*
* It is only meaningful if hasBeenSignaled() returns true.
*
* @return integer
* @return int
*
* @throws RuntimeException In case --enable-sigchild is activated
*
Expand Down Expand Up @@ -546,7 +559,7 @@ public function hasBeenStopped()
*
* It is only meaningful if hasBeenStopped() returns true.
*
* @return integer
* @return int
*
* @api
*/
Expand Down Expand Up @@ -612,10 +625,10 @@ public function getStatus()
/**
* Stops the process.
*
* @param integer|float $timeout The timeout in seconds
* @param integer $signal A posix signal to send in case the process has not stop at timeout, default is SIGKILL
* @param int|float $timeout The timeout in seconds
* @param int $signal A posix signal to send in case the process has not stop at timeout, default is SIGKILL
*
* @return integer The exit-code of the process
* @return int The exit-code of the process
*
* @throws RuntimeException if the process got signaled
*/
Expand Down Expand Up @@ -704,7 +717,7 @@ public function getTimeout()
*
* To disable the timeout, set this value to null.
*
* @param integer|float|null $timeout The timeout in seconds
* @param int|float|null $timeout The timeout in seconds
*
* @return self The current Process instance
*
Expand All @@ -728,7 +741,7 @@ public function setTimeout($timeout)
/**
* Enables or disables the TTY mode.
*
* @param boolean $tty True to enabled and false to disable
* @param bool $tty True to enabled and false to disable
*
* @return self The current Process instance
*/
Expand Down