diff --git a/src/CLI/Console.php b/src/CLI/Console.php index 916df25..4b8af2a 100644 --- a/src/CLI/Console.php +++ b/src/CLI/Console.php @@ -131,7 +131,7 @@ public static function exit(int $status = 0): void * @param int $timeout * @return int */ - public static function execute(string $cmd, string $stdin, string &$stdout, string &$stderr, int $timeout = -1): int + public static function execute(string $cmd, string $stdin, string &$stdout, string &$stderr, int $timeout = -1, callable $onProgress = null): int { $cmd = '( '.$cmd.' ) 3>/dev/null ; echo $? >&3'; @@ -157,8 +157,14 @@ public static function execute(string $cmd, string $stdin, string &$stdout, stri } while (\is_resource($process)) { - $stdout .= \stream_get_contents($pipes[1]); - $stderr .= \stream_get_contents($pipes[2]); + $stdoutContents = \stream_get_contents($pipes[1]) ?: ''; + $stderrContents = \stream_get_contents($pipes[2]) ?: ''; + if (isset($onProgress) && (! empty($stdoutContents) || ! empty($stderrContents))) { + $onProgress($stdoutContents, $stderrContents, $process); + } + + $stdout .= $stdoutContents; + $stderr .= $stderrContents; $status .= \stream_get_contents($pipes[3]); if ($timeout > 0 && \time() - $start > $timeout) { diff --git a/tests/CLI/ConsoleTest.php b/tests/CLI/ConsoleTest.php index 790c32a..d80582e 100755 --- a/tests/CLI/ConsoleTest.php +++ b/tests/CLI/ConsoleTest.php @@ -38,6 +38,26 @@ public function testExecuteBasic() $this->assertEquals(0, $code); } + public function testExecuteStream() + { + $stdout = ''; + $stderr = ''; + $stdin = ''; + + $stdoutStream = ''; + $stderrStream = ''; + $code = Console::execute('printf 1 && sleep 1 && printf 2 && sleep 1 && printf 3 && sleep 1 && printf 4 && sleep 1 && printf 5', $stdin, $stdout, $stderr, 10, function ($stdout, $stderr) use (&$stdoutStream, &$stderrStream) { + $stdoutStream .= $stdout; + $stderrStream .= $stderr; + }); + + $this->assertEquals('', $stderr); + $this->assertEquals('12345', $stdout); + $this->assertEquals('', $stderrStream); + $this->assertEquals('12345', $stdoutStream); + $this->assertEquals(0, $code); + } + public function testExecuteStdOut() { $stdout = '';