Return to bug60120.phpt CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / standard / tests / file |
1.1 misho 1: --TEST-- 2: Bug #60120 (proc_open hangs when data in stdin/out/err is getting larger or equal to 2048) 3: --SKIPIF-- 4: <?php 5: if (substr(PHP_OS, 0, 3) != 'WIN') { 6: die('skip only for Windows'); 7: } 8: $php = getenv('TEST_PHP_EXECUTABLE'); 9: if (!$php) { 10: die("No php executable defined\n"); 11: } 12: ?> 13: --FILE-- 14: <?php 15: 16: error_reporting(E_ALL); 17: 18: $php = getenv('TEST_PHP_EXECUTABLE'); 19: if (!$php) { 20: die("No php executable defined\n"); 21: } 22: $cmd = 'php -r "fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);"'; 23: $descriptors = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')); 24: $stdin = str_repeat('*', 1024 * 16) . '!'; 25: $stdin = str_repeat('*', 2049 ); 26: 27: $options = array_merge(array('suppress_errors' => true, 'binary_pipes' => true, 'bypass_shell' => false)); 28: $process = proc_open($cmd, $descriptors, $pipes, getcwd(), array(), $options); 29: 30: foreach ($pipes as $pipe) { 31: stream_set_blocking($pipe, false); 32: } 33: $writePipes = array($pipes[0]); 34: $stdinLen = strlen($stdin); 35: $stdinOffset = 0; 36: 37: unset($pipes[0]); 38: 39: while ($pipes || $writePipes) { 40: $r = $pipes; 41: $w = $writePipes; 42: $e = null; 43: $n = stream_select($r, $w, $e, 60); 44: 45: if (false === $n) { 46: break; 47: } elseif ($n === 0) { 48: proc_terminate($process); 49: 50: } 51: if ($w) { 52: $written = fwrite($writePipes[0], (binary)substr($stdin, $stdinOffset), 8192); 53: if (false !== $written) { 54: $stdinOffset += $written; 55: } 56: if ($stdinOffset >= $stdinLen) { 57: fclose($writePipes[0]); 58: $writePipes = null; 59: } 60: } 61: 62: foreach ($r as $pipe) { 63: $type = array_search($pipe, $pipes); 64: $data = fread($pipe, 8192); 65: if (false === $data || feof($pipe)) { 66: fclose($pipe); 67: unset($pipes[$type]); 68: } 69: } 70: } 71: echo "OK."; 72: ?> 73: --EXPECT-- 74: OK.