2008-12-06 48 views
17

下面是我嘗試執行命令,沒有成功:如何檢索PHP exec()錯誤響應?

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess'); 

當你在末尾添加一個模具(),它捕獲的是有一個錯誤:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!'); 

對於上述EXEC( )聲明,權限問題導致錯誤,但PHP不顯示它。你如何從PHP顯示什麼錯誤發生?

回答

15

你可以通過一個可選的第二個參數接收exec function的輸出結果:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output); 
var_dump($output); 
+5

$輸出將只持有從sdtout輸出不「2之間的空間是很重要的sdterr – Amaynut 2016-10-27 20:40:51

2

如果不通過第二個參數發現錯誤,你可以搜索的Apache的錯誤日誌,例如在Ubuntu服務器12.10通過命令 $ tail /var/log/apache2/error.log 我正在運行一個python腳本,它的錯誤只在那裏打印,因此我能夠診斷它。 此致敬禮。

7

如果調用程序將輸出輸出到STDERR,則$ output參數看起來不起作用。

處理此問題的更好方法是將輸出從exec重定向到文件,然後在出現錯誤情況時顯示該文件的內容。

如果$ CMD擁有exec命令添加如下內容:

$cmd.=" > $error_log 2>&1" 

然後檢查$ error_log中的文件規範對命令失敗原因的詳細信息的內容。

另請注意,如果您在命令末尾使用&進行分解,立即檢查$ error_log的內容可能不會顯示日誌信息 - 腳本可能會在操作系統有問題之前檢查/處理文件完了。

6

下面的代碼將同時捕獲正常輸出(來自STDOUT)和誤差輸出(來自SdtErr)。

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output); 
var_dump($output); 
+0

爲我工作:) – vijay 2017-01-18 13:13:10

2

這幾種情況下工作對我來說:

ob_start(); 
exec($cmd . " 2>&1", $output); 
$result = ob_get_contents(); 
ob_end_clean(); 
var_dump($result); 

在這種情況下