在php中运行shell命令,实时输出

时间:2012-02-15 21:46:43

标签: php shell

我通过php move_uploaded_file函数上传文件,然后将该文件作为java程序的参数。当java程序正在执行时,它输出终端中的进度。 java程序的输出是perl脚本的输入,它执行相同的操作。 我在我的php网站上执行所有这些作为shell_exec函数并在屏幕上打印

    echo "Running java ..... ";
    $output=shell_exec("java -jar abc.jar ".( $_FILES['uploaded']['name']));
    echo "<pre>$output</pre>";
    echo "running perl .....";
    $output=shell_exec("perl abc.pl outputfromjava.txt");
    echo "<pre>$output</pre>";

shell命令运行正常,但java和perl的输出没有显示在我的网站上。

后,我尝试在执行java和perl之后在代码中刷新页面,但它会刷新上传。

现在输出

Running java ....
Running Perl ....

我应该如何编写我的php以便输出

Running Java...
Progress1 //from java output
progress2 //from java output
Running Perl....
Progress1 //from perl output
progress2 //from perl output

由于

3 个答案:

答案 0 :(得分:4)

使用ob_end_flush禁用输出缓冲,并使用proc_open而不是shell_exec启动进程,这样您就可以完全控制文件描述符,而无需等待进程完成输出。当您使用proc_open启动该过程时,请从其STDOUT和STDERR读取并将其输出到浏览器,可能使用flush以确保您的输出不会保留在任何缓冲区中。

答案 1 :(得分:2)

这是我的解决方案:(在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();

答案 2 :(得分:-1)

尝试> file.txt然后读取文件。

:)