2009-02-02 192 views
4

我試圖通過一個PHP命令行腳本執行一個linux命令,使用exec命令沒有問題。用PHP執行linux命令

問題是,我正在執行的命令(mysqldump)在出現錯誤時輸出錯誤消息(例如用戶名/密碼不正確)。我似乎無法捕捉到這個錯誤以記錄它。它只是將這個錯誤打印到屏幕上。

如何導致此錯誤不會被打印到屏幕上,而是將其放入一個變量以便在腳本中使用?

謝謝!

回答

0

你看過system()命令嗎?自從我做了任何PHP以來,這已經有一段時間了,但是這聽起來很響。

+0

這是一個別名EXEC – troelskn 2009-02-02 19:30:51

0

嘗試使用反引號?

 

$var = `command`; 

1

我不是太熱的Unix(新年分辨率...),但這些功能看起來有所幫助:

  • shell_exec - 返回結果爲字符串。
  • passthru - 它看起來像你可以執行這樣的:passthru('command', $result);,然後使用$result
2
exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log"); 
2

您需要redirect stderr to stdout,所以你可以捕捉它。本實施例中的路由標準輸出到devnull(因此ignoreing它)和路線錯誤輸出到你:

exec('ls * 2>&1 1>/dev/null'); 
+0

不要忘記清理任何用戶輸入! escapeshellarg,escapeshellcmd等 – 2009-02-02 15:47:28

0

下面將路由標準錯誤消息發送到同一個地方正常輸出。

exec("mysql_dump blah 2>&1",$output,$return_val) 
if($return_val !== 0) 
echo "there was an error" 

2> & 1裝置重新路由標準錯誤消息發送到同一個地方標準輸出,從而將被加載到輸出數組。

4

使用popen來運行該過程。這個例子#2此頁面上顯示正是你要尋找的:

<?php 
error_reporting(E_ALL); 

/* Add redirection so we can get stderr. */ 
$handle = popen('/path/to/spooge 2>&1', 'r'); 
echo "'$handle'; " . gettype($handle) . "\n"; 
$read = fread($handle, 2096); 
echo $read; 
pclose($handle); 
?> 
+0

@edanb:這是一個足夠好的解決方案。但是我不是bash的粉絲,所以如果你願意花更多的時間來處理錯誤,我建議你使用proc_open。 – artificialidiot 2009-02-02 19:25:35