使用proc_open的多流选择从慢进程接收响应



我正在使用proc_open从WP插件调用一个缓慢的python脚本作为子进程(echonest remix代码),并在此问题中找到一些代码的变体。

(python)脚本需要大约一分钟来处理(一堆音频),我希望找到一种方法来显示输出到浏览器,因为它是从python脚本打印出来的。目前,整个函数的输出直到proc_open和stream_select进程结束才显示出来。这甚至包括在函数开始处的echo语句。

<?php
echo "Why wait before printing me out?";
$description = array (     
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout
    2 => array("pipe", "w")   // stderr
);
$application_system = "python ";
$application_name .= "glitcher/glitchmix.py";
$application = $application_system.$application_name.$separator;
$argv1 = 'a variable';
$argv2 = 'another variable';
$separator = " ";
$pipes = array();
$proc = proc_open ( $application.$separator.$argv1.$separator.$argv2, $description , $pipes, glitch_player_DIR);
// set all streams to non blockin mode
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
// get PID via get_status call
$status = proc_get_status($proc);
// status check here if($status === FALSE)
$pid = $status['pid'];
// now, poll for childs termination
while(true) {
    // detect if the child has terminated - the php way
    $status = proc_get_status($proc);
    //  retval checks : ($status === FALSE) and ($status['running'] === FALSE)
    // read from childs stdout and stderr
    // avoid *forever* blocking through using a time out (1sec)
    foreach(array(1, 2) as $desc) {
        // check stdout for data
        $read = array($pipes[$desc]);
        $write = NULL;
        $except = NULL;
        $tv = 1;
        $n = stream_select($read, $write, $except, $tv);
        if($n > 0) {
            do {
                $data = fgets($pipes[$desc], 8092);
                echo $data . "n<br/>";
            } while (strlen($data) > 0);
        }
    }
}
?>

是否可以使用多个调用stream_select来响应子进程输出?

显然,我是套接字编程的新手,我期待从sso社区获得更多的见解。

这是一个有趣而简单的原因。参见Python的-u选项。我在同一个问题上浪费了两天时间。当我用bash代替python并测试bash脚本的一些输出时,它立即接收到它。

相关内容

  • 没有找到相关文章

最新更新