bug60120.phpt 1.7 KB

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