输出问题proc_open()

问题描述:

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

<?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(); 
+0

尝试使用'flush()'作为输出最有可能被缓冲。 –

+0

是的,'flush()'+一些代码修改做到了!你知道我在哪里可以发布修改后的代码,现在可以工作吗? –

当使用PHP的CLI版本,输出仍然是缓冲 - 这样一个页面发送给用户的正常时间是在脚本的结尾。

与任何版本的PHP一样 - 使用flush()将强制将输出发送给用户。您也应该使用PHP_EOL,它为您的任何平台(linux和Windows使用不同的字符 - \ r \ n或\ n)输出正确的新行。 PHP_EOL是创建新行的安全方式。