2011-08-31 39 views
2

據我瞭解,PHP的passthru顯示控制檯的純粹輸出 - 包括所有輸出,如STDERR。我試圖從一個PHP文件的javac文件像這樣:如何在PHP中使用passthru顯示javac錯誤消息?

<?php 
error_reporting(E_ALL); 

    if(file_put_contents("code.java", "aaaaaa")) 
    { 
     passthru("javac -verbose code.java"); 
     echo("Done."); 
    } 
    else 
    { 
     echo("UNEXPECTED PHP ERROR"); 
    } 
?> 

正如你可能已經猜到,「AAAAAAA」不應該編譯 - 這我期望從javac的呼叫(而不是輸出提 - 詳細)。然而,當我訪問網頁時,我注意到兩兩件事:

  1. code.java成功創建並充滿我指定的數據。

  2. 該網頁的唯一輸出是「完成」。

請注意,如果我從cmd提示符調用完全相同的命令,我會得到一整個輸出。這裏發生了什麼?

tl; dr;爲什麼我沒有從passthru()獲得任何輸出?

編輯:如果我改變中繼命令字符串「回聲PLEASEWORK」它正確


顯示輸出,出於某種原因,我不能發表評論 - Quamis,什麼是執行這個CMD的首選方法並捕獲所有輸出?

+2

輸出到'STDERR'去Apache的錯誤日誌。您需要將其重定向到'STDOUT'以在瀏覽器中查看它。 –

回答

2

在人文件http://php.net/manual/en/function.passthru.php我可以清楚地讀出「此功能應該在適當位置執行exec()或系統()一起使用時從Unix命令的輸出是需要回直接傳遞給二進制數據瀏覽器」。這意味着passthry是不是這個任務:)

這不是你的情況你最好的朋友......

嘗試使用passthru("your_command_here 2>&1")捕捉到標準輸出和標準錯誤。

+0

Billybob出於某種原因無法發表評論,他問你:「執行此cmd並捕獲所有輸出的首選方法是什麼?」 – Arsen7

+0

@ Arsen7:使用'exec()' – Quamis

+0

'exec(「your_command_here 2>&1」)'應該以「首選」的方式來訣竅 – Quamis

2

如前所述,輸出到STDERR去Apache的日誌文件。 「看到」它在瀏覽器中,你需要將其重定向到STDOUT

$command = "javac -verbose code.java 2>&1"; 
$result = passthru($command); 

這就是所謂的file descriptor redirection