在 PHP 中呼叫系統命令時,正確捕獲標準輸出與標準錯誤至關重要。本文說明 shell_exec 搭配 2>&1 的用法與常見坑點。
<?php
$message = shell_exec("sudo /usr/local/webserver/nginx/sbin/nginx -t 2>&1");
echo "運行結果: " . $message . "<br/>";
?>
2>&1 的作用2 代表標準錯誤輸出(stderr)。1 代表標準輸出(stdout)。2>&1 將 stderr 重導向到 stdout,使 shell_exec 能同時捕獲正常輸出與錯誤訊息。若省略 2>&1,當命令輸出到 stderr 時,shell_exec 回傳空字串,導致以為命令無輸出或執行失敗。
| 函數 | 回傳值 | 特點 |
|---|---|---|
| shell_exec | 字串(完整輸出) | 適合捕獲完整輸出,內部用反引號 `cmd` 實現 |
| exec | 最後一行輸出;第二參數接收所有輸出陣列 | 可獲取退出碼(第三參數) |
| system | 最後一行輸出;直接輸出到瀏覽器 | 類似 C 的 system(),適合即時顯示 |
| passthru | 無;直接輸出二進制資料 | 適合圖片、PDF 等二進制輸出 |
| proc_open | 資源句柄;雙向管道 | 最高控制權,可互動、非阻塞 |
escapeshellarg()、escapeshellcmd()。sudo,若必要請配置 /etc/sudoers 免密執行特定命令。<?php
$cmd = "nginx -t";
$output = [];
$exitCode = 0;
exec(escapeshellcmd($cmd) . " 2>&1", $output, $exitCode);
echo "Exit Code: $exitCode\n";
echo "Output:\n" . implode("\n", $output);
掌握重導向與函數差異,能讓你在 PHP 中安全、可靠地呼叫外部程式。