【问题标题】:php shell_exec with realtime updatingphp shell_exec 实时更新
【发布时间】:2012-01-12 07:50:11
【问题描述】:

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

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

不胜感激!

【问题讨论】:

    标签: php popen shell-exec


    【解决方案1】:
    if( ($fp = popen("your command", "r")) ) {
        while( !feof($fp) ){
            echo fread($fp, 1024);
            flush(); // you have to flush buffer
        }
        fclose($fp);
    }
    

    【讨论】:

    • 为什么要刷新缓冲区?
    【解决方案2】:

    有两种可能的行为:

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

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

    【讨论】:

    • 我将如何使用 passthru?另外,如果我不需要在两次刷新之间做任何事情,使用@GameBit 的代码有什么缺点吗?
    • 你传递了与popen解决方案中相同的命令,但外部程序的输出直接进入输出......如果你知道fopen和readfile之间的区别,实际上是一样的,只是与流程。首先允许您逐字节读取并放入变量,处理数据,另一个简单的读写直接输出,无需任何操作。
    • 知道了。实际上更容易使用。奥布里加多! :D
    【解决方案3】:

    试试这个代码(在 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();
    

    【讨论】:

      【解决方案4】:

      有一个肮脏的简单选项

      `yourcommand 1>&2`;
      

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

      【讨论】:

        【解决方案5】:

        我使用了这个解决方案。对我来说效果很好。

        $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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-23
          • 1970-01-01
          • 2018-03-18
          • 1970-01-01
          • 1970-01-01
          • 2015-04-05
          相关资源
          最近更新 更多