子流程输出未被返回'实时'

时间:2016-09-06 14:29:21

标签: php symfony

我只是测试了Symfony Process Component,它似乎没有按照它所说的那样做。

文档状态

  

执行长时间运行的命令(如rsync-ing文件到远程服务器)时,您可以通过将匿名函数传递给run()方法来实时向最终用户提供反馈:

我有1个文件,内容如下

$process = new Process('php terminal.php');
$process->setTimeout(null);
$process->run( function ( $type, $buffer ) {
    if (Process::ERR === $type) {
        echo 'ERR > '.$buffer;
    } else {
        echo 'OUT > '.$buffer;
    }
});

和另一个

$x = 10;
while( $x ) {
    echo "{$x}\n";
    sleep(1);
    $x--;
}

10秒等待后通过终端运行此输出时

OUT > 10
OUT > 9
OUT > 8
OUT > 7
OUT > 6
OUT > 5
OUT > 4
OUT > 3
OUT > 2
OUT > 1

显示上面有10次闭包迭代,但是在完成该过程之前没有输出。

我在这里错过了什么吗?

问候,卢克

1 个答案:

答案 0 :(得分:0)

您需要使用:

flush();
ob_flush();

在您的第一个代码上:

$process = new Process('php terminal.php');
$process->setTimeout(null);
$process->run( function ( $type, $buffer ) {
    if (Process::ERR === $type) {
        echo 'ERR > '.$buffer;
    } else {
        echo 'OUT > '.$buffer;
    }
    flush();
    ob_flush();
});

第二天:

$x = 10;
while( $x ) {
    echo "{$x}\n";
    flush();
    ob_flush();
    sleep(1);
    $x--;
}

在php.net上的更多信息:ob_flushflush