PHP 應用有時需要呼叫外部程式或系統指令(如影像處理、檔案轉換、系統管理)。本文說明在 Windows (WAMP) 環境下啟用命令執行的 PHP 設定、常用函數比較、除錯技巧與安全注意事項。
php.inisafe_mode = Offdisable_functions 移除需用的函數,例如:
disable_functions = proc_open, popen, system, shell_exec
| 函數 | 回傳值 | 適用場景 |
|---|---|---|
exec() | 最後一行輸出(字串);可選參數接收完整輸出陣列與回傳碼 | 需取得狀態碼、逐行處理輸出 |
shell_exec() | 完整輸出字串 | 需完整輸出、不關心狀態碼 |
system() | 最後一行輸出;直接輸出至輸出緩衝 | 即時顯示輸出、簡單腳本 |
passthru() | 無;直接輸出二進位資料 | 圖片/二進位串流 |
proc_open() | 資源控制代碼;可雙向管道控制 stdin/stdout/stderr | 複雜互動、長時間程序 |
string exec(string $command, array &$output = null, int &$return_var = null)
$command:欲執行的指令字串$output:參考參數,接收每一行輸出(不含換行)$return_var:參考參數,接收程式結束狀態碼(0 成功、非 0 失敗)<?php
exec("mkdir d:\\test", $out);
print_r($out); // 成功時通常為空陣列
// 執行後 D 槻將出現 test 資料夾
?>
預設僅捕捉 stdout,stderr 會被丟棄。使用 2>&1 重導向 stderr 至 stdout:
// 原本無法得知轉檔失敗原因
exec('convert a.jpg b.jpg', $output, $return_val);
// 改為捕捉錯誤訊息
exec('convert a.jpg b.jpg 2>&1', $output, $return_val);
print_r($output); // 顯示 ImageMagick 錯誤細節
escapeshellcmd() 或 escapeshellarg() 轉義。iconv('UTF-8', 'CP950', $cmd) 轉換。max_execution_time 或使用 proc_open 非阻塞模式。PHP 執行系統命令功能強大但風險極高。生產環境應盡量避免,若必須使用,請嚴格限制權限、驗證輸入、記錄稽核日誌,並優先評估純 PHP 替代方案。