2011-04-09 46 views
3

對於像 'ls' 的常用命令,執行exec()正常工作,如:PHP的系統()/執行exec()不返回輸出

exec('ls',$output,$retval); 
var_dump($output,$retval); 
// $output contains an array of filenames, and retval === 0 

但試圖執行另一個程序時,我可以」 t得到輸出:

exec('some_command --a_parameter',$output,$retval); 
var_dump($output,$retval); 
// $output contains an empty array, end $retval === 0 

該命令直接從命令行執行時會打印一些行。 我知道命令已成功,因爲結果(一些文件更新,數據添加等),但我看不到輸出。

任何想法?

+0

您發出的命令是否實際打印輸出? – Khez 2011-04-09 03:10:59

+0

它直接從命令行執行。我的意思是我可以看到屏幕上出現一些文字。也許有不同類型的輸出? – HappyDeveloper 2011-04-09 03:11:59

+0

請問您正在運行的實際命令是什麼? – Charles 2011-04-09 03:57:56

回答

19

這聽起來像程序正在輸出其警告標準錯誤,而不是標準輸出。 exec只會捕獲標準輸出。我不知道標準錯誤總是發送到apache錯誤日誌,但似乎很可能。

如果你不需要與非* nix系統的兼容性,您可以通過附加2>&1到命令標準錯誤重定向到標準輸出:

exec('some_command --option 2>&1', $output, $ret); 

這都應該讓現有的警告,你的php程序並防止不必要的記錄。

+1

add 2>&1但輸出仍然是陣列空的,如果從cmd執行,它會輸出2個值 – 2014-12-10 06:19:31

+0

嗯可能是命令只在輸出指向終端時輸出。你想做什麼? – intuited 2014-12-10 21:15:16

0

所有的輸出被髮送到的httpd/error_log中當一些*原因,當應用程序發現了一個警告(東西內部,即使不是致命的)

我的解決辦法:當沒有輸出,假設它失敗了。 我的apache日誌會變髒,但無論如何。