2017-07-24 102 views
0

我有一個小的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()'+一些代碼修改做到了!你知道我在哪裏可以發佈修改後的代碼,現在可以工作嗎? –

回答

0

當使用PHP的CLI版本,輸出仍然是緩衝 - 這樣一個頁面發送給用戶的正常時間是在腳本的結尾。

與任何版本的PHP一樣 - 使用flush()將強制將輸出發送給用戶。您也應該使用PHP_EOL,它爲您的任何平臺(linux和Windows使用不同的字符 - \ r \ n或\ n)輸出正確的新行。 PHP_EOL是創建新行的安全方式。