php shell_exec实时更新

时间:2011-12-03 20:10:56

标签: php popen shell-exec

我有这个shell程序,我想通过php执行。问题是它可能需要很长时间,因此我需要它来实时更新用户的浏览器。

我读到我可能需要使用popen()来做到这一点,但我有点(好吧,我真的是:P)一个PHP菜鸟,无法弄清楚我是怎么做到的。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:14)

if( ($fp = popen("your command", "r")) ) {
    while( !feof($fp) ){
        echo fread($fp, 1024);
        flush(); // you have to flush buffer
    }
    fclose($fp);
}

答案 1 :(得分:2)

有两种可能的行为:

  1. 非阻止,您需要在刷新之间执行其他操作(@GameBit显示如何执行此操作)。

  2. 使用Block,等待被叫命令完成,在本例中为passthru function

答案 2 :(得分:2)

有一个简单易用的选项

`yourcommand 1>&2`;

将stdout重定向到stderr。

答案 3 :(得分:0)

我使用了这种解决方案。对我来说很好。

$commandString = "myexe";

# Uncomment this line if you want to execute the command in background on Windows
# $commandString = "start /b $commandString";

$exec = popen($commandString, "r");

# echo "Async Code Test";

while($output = fgets($exec, 2048))
{
    echo "$output <br>\n";
    ob_flush();
    flush();
}

pclose($exec);

答案 4 :(得分:-1)

尝试此代码(在Windows机器+ wamp服务器上测试)

        header('Content-Encoding: none;');

        set_time_limit(0);

        $handle = popen("<<< Your Shell Command >>>", "r");

        if (ob_get_level() == 0) 
            ob_start();

        while(!feof($handle)) {

            $buffer = fgets($handle);
            $buffer = trim(htmlspecialchars($buffer));

            echo $buffer . "<br />";
            echo str_pad('', 4096);    

            ob_flush();
            flush();
            sleep(1);
        }

        pclose($handle);
        ob_end_flush();