* This file is part of the ManageWP Worker plugin.
* (c) ManageWP LLC <contact@managewp.com>
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
class MWP_Stream_ProcessOutput extends MWP_Stream_Callable
* @var Symfony_Process_Process
public function __construct(Symfony_Process_Process $process)
parent::__construct(array($this, 'getIncrementalOutput'));
$this->process = $process;
* Returns incremental process output (even if empty string) or false if the process has finished
* successfully and all output was already returned.
* @throws Symfony_Process_Exception_ProcessFailedException If the process did not exit successfully.
public function getIncrementalOutput()
} catch (Symfony_Process_Exception_ExceptionInterface $e) {
throw new Symfony_Process_Exception_ProcessFailedException($this->process);
if ($this->process->isRunning()) {
$output = $this->process->getIncrementalOutput();
$this->process->clearOutput();
if (strlen($output) < Symfony_Process_Pipes_PipesInterface::CHUNK_SIZE) {
// Don't hog the processor while waiting for incremental process output.
// The stream will be read again because we're returning a string.
if (!$this->process->isSuccessful()) {
throw new Symfony_Process_Exception_ProcessFailedException($this->process);
$output = $this->process->getIncrementalOutput();
$this->process->clearOutput();
// The process has finished and is successful. This part will probably get run twice,
// first time we'll return final output, second time we'll return 'false' and break the loop.
return strlen($output) ? $output : false;