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

This commit is contained in:
Evgeniy Sokolov 2015-11-10 01:31:08 +01:00 committed by Nicolas Grekas
parent d46d725d27
commit 9cf90fbcbf
1 changed files with 32 additions and 19 deletions

View File

@ -119,12 +119,12 @@ class Process
/** /**
* Constructor. * Constructor.
* *
* @param string $commandline The command line to run * @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 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 array|null $env The environment variables or null to inherit
* @param string|null $stdin The STDIN content * @param string|null $stdin The STDIN content
* @param integer|float|null $timeout The timeout in seconds or null to disable * @param int|float|null $timeout The timeout in seconds or null to disable
* @param array $options An array of options for proc_open * @param array $options An array of options for proc_open
* *
* @throws RuntimeException When proc_open is not installed * @throws RuntimeException When proc_open is not installed
* *
@ -184,7 +184,7 @@ class Process
* @param callback|null $callback A PHP callback to run whenever there is some * @param callback|null $callback A PHP callback to run whenever there is some
* output available on STDOUT or STDERR * 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 * @throws RuntimeException When process can't be launch or is stopped
* *
@ -238,8 +238,20 @@ class Process
} }
} }
$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); $this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options);
if ($ptsWorkaround) {
fclose($ptsWorkaround);
}
if (!is_resource($this->process)) { if (!is_resource($this->process)) {
throw new RuntimeException('Unable to launch a new process.'); throw new RuntimeException('Unable to launch a new process.');
} }
@ -287,7 +299,7 @@ class Process
* *
* @param callback|null $callback A valid PHP callback * @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 timed out
* @throws RuntimeException When process stopped after receiving signal * @throws RuntimeException When process stopped after receiving signal
@ -302,7 +314,7 @@ class Process
do { do {
$this->checkTimeout(); $this->checkTimeout();
$running = defined('PHP_WINDOWS_VERSION_BUILD') ? $this->isRunning() : $this->processPipes->hasOpenHandles(); $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); $this->readPipes(true, $close);
} while ($running); } while ($running);
@ -324,7 +336,7 @@ class Process
/** /**
* Returns the Pid (process identifier), if applicable. * 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 * @throws RuntimeException In case --enable-sigchild is activated
*/ */
@ -342,7 +354,8 @@ class Process
/** /**
* Sends a posix signal to the process. * 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 * @return Process
* *
* @throws LogicException In case the process is not running * @throws LogicException In case the process is not running
@ -434,7 +447,7 @@ class Process
/** /**
* Returns the exit code returned by the process. * 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 * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
* *
@ -508,7 +521,7 @@ class Process
* *
* It is only meaningful if hasBeenSignaled() returns true. * It is only meaningful if hasBeenSignaled() returns true.
* *
* @return integer * @return int
* *
* @throws RuntimeException In case --enable-sigchild is activated * @throws RuntimeException In case --enable-sigchild is activated
* *
@ -546,7 +559,7 @@ class Process
* *
* It is only meaningful if hasBeenStopped() returns true. * It is only meaningful if hasBeenStopped() returns true.
* *
* @return integer * @return int
* *
* @api * @api
*/ */
@ -612,10 +625,10 @@ class Process
/** /**
* Stops the process. * Stops the process.
* *
* @param integer|float $timeout The timeout in seconds * @param int|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 $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 * @throws RuntimeException if the process got signaled
*/ */
@ -704,7 +717,7 @@ class Process
* *
* To disable the timeout, set this value to null. * 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 * @return self The current Process instance
* *
@ -728,7 +741,7 @@ class Process
/** /**
* Enables or disables the TTY mode. * 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 * @return self The current Process instance
*/ */