php – 在流中读取实时整个输出

注意:这篇文章与这个
post有区别,其接受的答案只是一次读取每一行.

我必须在服务器端切割用于3D打印的3D模型,这个过程将耗费一些时间.所以我必须为用户显示进程,我使用redis来存储进程.我想每0.5秒刷新一次这个过程.
例如,睡眠0.5秒,读取点中的所有内容并每次处理它.

现在我尝试了以下两个,第一个将持续到完成.第二次使用虽然不是一种正确的方法,但它会不断写入redis会导致客户端读取进程请求保持到最后.

我试过这两个:

第一个将持续到命令完成.

$descriptorspec = array(
    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "w")    //here curaengine log all the info into stderror
);
$command = './CuraEngine slice -p -j ' . $fdmprinterpath . ' -j ' . $configpath . ' -o ' . $gcodepath . ' -l ' . $tempstlpath;
$cwd = '/usr/local/curaengine';
$process = proc_open($command, $descriptorspec, $pipes, $cwd);
if(is_resource($process))
{
    print stream_get_contents($pipes[1]);  //This will hold until the command finished.
}

而第二个实现为这个post将每次一行.

  $descriptorspec = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("pipe", "w")    //here curaengine log all the info into stderror
    );
    $command = './CuraEngine slice -p -j ' . $fdmprinterpath . ' -j ' . $configpath . ' -o ' . $gcodepath . ' -l ' . $tempstlpath;
    $cwd = '/usr/local/curaengine';
    $process = proc_open($command, $descriptorspec, $pipes, $cwd);
    if(is_resource($process))
    {
        while ($s = fgets($pipes[1])) {
            print $s;
            flush();
        }
    }

最佳答案 使用fread()替换fgets().

点赞