12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- define('ERR_SELECT_FAILED', 1);
- define('ERR_TIMEOUT', 2);
- define('ERR_READ_FAILED', 3);
- define('ERR_WRITE_FAILED', 4);
- $read = array(STDIN);
- $write = array(STDOUT, STDERR);
- stream_set_blocking(STDIN, 0);
- stream_set_blocking(STDOUT, 0);
- stream_set_blocking(STDERR, 0);
- $out = $err = '';
- while ($read || $write) {
- $r = $read;
- $w = $write;
- $e = null;
- $n = stream_select($r, $w, $e, 5);
- if (false === $n) {
- die(ERR_SELECT_FAILED);
- } elseif ($n < 1) {
- die(ERR_TIMEOUT);
- }
- if (in_array(STDOUT, $w) && strlen($out) > 0) {
- $written = fwrite(STDOUT, (binary) $out, 32768);
- if (false === $written) {
- die(ERR_WRITE_FAILED);
- }
- $out = (binary) substr($out, $written);
- }
- if (null === $read && '' === $out) {
- $write = array_diff($write, array(STDOUT));
- }
- if (in_array(STDERR, $w) && strlen($err) > 0) {
- $written = fwrite(STDERR, (binary) $err, 32768);
- if (false === $written) {
- die(ERR_WRITE_FAILED);
- }
- $err = (binary) substr($err, $written);
- }
- if (null === $read && '' === $err) {
- $write = array_diff($write, array(STDERR));
- }
- if ($r) {
- $str = fread(STDIN, 32768);
- if (false !== $str) {
- $out .= $str;
- $err .= $str;
- }
- if (false === $str || feof(STDIN)) {
- $read = null;
- if (!feof(STDIN)) {
- die(ERR_READ_FAILED);
- }
- }
- }
- }
|