proc_open() 的输出问题

output problems with proc_open()

我有一个 PHP 编写的小 CLI 脚本,它作为来自 Linux 的基于 CLI 的 calc 的前端。该脚本从用户那里获取数学表达式并将它们传递给 calc。然后,当用户想要退出时,他只需输入 stop。在这种情况下,脚本将 exit 发送到 calc。此脚本的问题在于它仅在用户发送 stop 时才在最后显示输出。但是我需要有每个用户的数学表达式的输出。脚本如下:

 <?php

    define('BUFSIZ', 1024);
    define('EXIT_CMD', 'stop');

    function printOutput(&$fd) {
         while (!feof($fd)) {
            echo fgets($fd, BUFSIZ);
        }   
    }

    function &getDescriptorSpec()
    {
        $spec = array(
            0 => array("pty"), // stdin
            1 => array("pty"), // stdout
            2 => array("pty") // stderr
        );
        return $spec;
    }

    function readInputLine(&$fd)
    {
        echo "Enter your input\n";
        $line = trim(fgets($fd)); 
        return $line;
    }

    function sendCmd(&$fd, $cmd)
    {
        fwrite($fd, "${cmd}\n");
    }

    function main() {

        $spec = getDescriptorSpec();
        $process = proc_open("calc", $spec, $pipes);
        if (is_resource($process)) {
            $procstdin = &$pipes[0];
            $procstdout = &$pipes[1];
            $fp = fopen('php://stdin', 'r');
            while (TRUE) {
                $line = readInputLine($fp);
                if (0 === strcmp($line, EXIT_CMD)) {
                    break;
                }
                sendCmd($procstdin, $line);

            }    
            sendCmd($procstdin, "exit");
            fclose($procstdin);
            printOutput($procstdout);
            fclose($procstdout);
            $retval = proc_close($process);
            echo "retval = $retval\n";
            fclose($fp);
        }
    }

    main();

当使用 PHP 的 CLI 版本时,输出仍然被缓冲 - 因此页面发送给用户的通常时间是在脚本末尾。

与 PHP 的任何版本一样 - 使用 flush() 将强制将输出发送给用户。

此外 - 您应该使用 PHP_EOL,它会为您使用的任何平台输出正确的新行(linux 和 Windows 使用不同的字符 - \r\n 或 \ n). PHP_EOL 是创建新行的安全方法。