bug #19118 [Process] Fix pipes cleaning on Windows (nicolas-grekas)
This PR was merged into the 2.7 branch.
Discussion
----------
[Process] Fix pipes cleaning on Windows
| Q | A
| ------------- | ---
| Branch? | 2.7
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #19089
| License | MIT
| Doc PR | -
Commits
-------
d54cd02
[Process] Fix pipes cleaning on Windows
This commit is contained in:
commit
ec19a527be
@ -47,14 +47,31 @@ class WindowsPipes extends AbstractPipes
|
|||||||
// Workaround for this problem is to use temporary files instead of pipes on Windows platform.
|
// Workaround for this problem is to use temporary files instead of pipes on Windows platform.
|
||||||
//
|
//
|
||||||
// @see https://bugs.php.net/bug.php?id=51800
|
// @see https://bugs.php.net/bug.php?id=51800
|
||||||
$this->files = array(
|
$pipes = array(
|
||||||
Process::STDOUT => tempnam(sys_get_temp_dir(), 'out_sf_proc'),
|
Process::STDOUT => Process::OUT,
|
||||||
Process::STDERR => tempnam(sys_get_temp_dir(), 'err_sf_proc'),
|
Process::STDERR => Process::ERR,
|
||||||
);
|
);
|
||||||
foreach ($this->files as $offset => $file) {
|
$tmpDir = sys_get_temp_dir();
|
||||||
if (false === $file || false === $this->fileHandles[$offset] = @fopen($file, 'rb')) {
|
if (!@fopen($file = $tmpDir.'\\sf_proc_00.check', 'wb')) {
|
||||||
throw new RuntimeException('A temporary file could not be opened to write the process output to, verify that your TEMP environment variable is writable');
|
throw new RuntimeException('A temporary file could not be opened to write the process output to, verify that your TEMP environment variable is writable');
|
||||||
}
|
}
|
||||||
|
@unlink($file);
|
||||||
|
for ($i = 0;; ++$i) {
|
||||||
|
foreach ($pipes as $pipe => $name) {
|
||||||
|
$file = sprintf('%s\\sf_proc_%02X.%s', $tmpDir, $i, $name);
|
||||||
|
if (file_exists($file) && !@unlink($file)) {
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
$h = @fopen($file, 'xb');
|
||||||
|
if (!$h || !$this->fileHandles[$pipe] = fopen($file, 'rb')) {
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
if (isset($this->files[$pipe])) {
|
||||||
|
@unlink($this->files[$pipe]);
|
||||||
|
}
|
||||||
|
$this->files[$pipe] = $file;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,9 @@ class ProcessTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testThatProcessDoesNotThrowWarningDuringRun()
|
public function testThatProcessDoesNotThrowWarningDuringRun()
|
||||||
{
|
{
|
||||||
|
if ('\\' === DIRECTORY_SEPARATOR) {
|
||||||
|
$this->markTestSkipped('This test is transient on Windows');
|
||||||
|
}
|
||||||
@trigger_error('Test Error', E_USER_NOTICE);
|
@trigger_error('Test Error', E_USER_NOTICE);
|
||||||
$process = $this->getProcess(self::$phpBin." -r 'sleep(3)'");
|
$process = $this->getProcess(self::$phpBin." -r 'sleep(3)'");
|
||||||
$process->run();
|
$process->run();
|
||||||
|
Reference in New Issue
Block a user