7

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

我读到我可能需要使用 popen() 来做到这一点,但我有点(好吧,我真的是:P)一个 PHP 菜鸟,不知道我是如何做到的。

将不胜感激任何帮助!

4

5 回答 5

17
if( ($fp = popen("your command", "r")) ) {
    while( !feof($fp) ){
        echo fread($fp, 1024);
        flush(); // you have to flush buffer
    }
    fclose($fp);
}
于 2011-12-03T20:30:43.270 回答
3

有一个肮脏的简单选择

`yourcommand 1>&2`;

将标准输出重定向到标准错误。

于 2016-09-12T12:03:39.960 回答
2

有两种可能的行为:

  1. 非阻塞,你需要在刷新之间做其他事情(@GameBit 展示如何做)。

  2. 使用 Block,等待调用的命令完成,在这种情况下查看passthru 函数

于 2011-12-03T20:57:22.330 回答
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);
于 2018-11-01T17:12:19.687 回答
-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();
于 2013-07-15T16:37:59.263 回答