我試圖通過一個PHP命令行腳本執行一個linux命令,使用exec命令沒有問題。用PHP執行linux命令
問題是,我正在執行的命令(mysqldump)在出現錯誤時輸出錯誤消息(例如用戶名/密碼不正確)。我似乎無法捕捉到這個錯誤以記錄它。它只是將這個錯誤打印到屏幕上。
如何導致此錯誤不會被打印到屏幕上,而是將其放入一個變量以便在腳本中使用?
謝謝!
我試圖通過一個PHP命令行腳本執行一個linux命令,使用exec命令沒有問題。用PHP執行linux命令
問題是,我正在執行的命令(mysqldump)在出現錯誤時輸出錯誤消息(例如用戶名/密碼不正確)。我似乎無法捕捉到這個錯誤以記錄它。它只是將這個錯誤打印到屏幕上。
如何導致此錯誤不會被打印到屏幕上,而是將其放入一個變量以便在腳本中使用?
謝謝!
你看過system()命令嗎?自從我做了任何PHP以來,這已經有一段時間了,但是這聽起來很響。
嘗試使用反引號?
$var = `command`;
我不是太熱的Unix(新年分辨率...),但這些功能看起來有所幫助:
shell_exec
- 返回結果爲字符串。passthru
- 它看起來像你可以執行這樣的:passthru('command', $result);
,然後使用$result
。exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log");
您需要redirect stderr to stdout,所以你可以捕捉它。本實施例中的路由標準輸出到devnull(因此ignoreing它)和路線錯誤輸出到你:
exec('ls * 2>&1 1>/dev/null');
不要忘記清理任何用戶輸入! escapeshellarg,escapeshellcmd等 – 2009-02-02 15:47:28
下面將路由標準錯誤消息發送到同一個地方正常輸出。
exec("mysql_dump blah 2>&1",$output,$return_val)
if($return_val !== 0)
echo "there was an error"
2> & 1裝置重新路由標準錯誤消息發送到同一個地方標準輸出,從而將被加載到輸出數組。
使用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);
?>
@edanb:這是一個足夠好的解決方案。但是我不是bash的粉絲,所以如果你願意花更多的時間來處理錯誤,我建議你使用proc_open。 – artificialidiot 2009-02-02 19:25:35
這是一個別名EXEC – troelskn 2009-02-02 19:30:51