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