首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP exec() 與 shell_exec() 差異深度解析:返回值處理關鍵不同

     編輯:PHP 綜合知識

核心差異總覽

特性exec()shell_exec()
返回值最後一行輸出(字串)完整輸出(字串,含換行)
輸出參數第二參數接收完整輸出陣列無(直接返回完整字串)
返回碼第三參數接收退出碼無法獲取
適用場景單行結果、需獲取退出碼多行結果、完整日誌輸出

實戰測試環境

# 目錄結構
-rw-rw-r--. 1 www web 133  7月 16 15:00 a.php
-rw-r--r--. 1 lee web  59  2月 29 17:05 b.php
-rw-r--r--. 1 lee web  81  3月  8 17:00 c.php

exec() 範例與輸出

<?php
$data = exec('/bin/ls -l');
echo '<pre>';
print_r($data);
echo '</pre>';
?>

輸出:

-rw-r--r--. 1 lee web  81 Mar  8 17:00 c.php

僅返回最後一行。

shell_exec() 範例與輸出

<?php
$data = shell_exec('/bin/ls -l');
echo '<pre>';
print_r($data);
echo '</pre>';
?>

輸出:

total 12
-rw-rw-r--. 1 www web 139 Jul 16  2012 a.php
-rw-r--r--. 1 lee web  59 Feb 29 17:05 b.php
-rw-r--r--. 1 lee web  81 Mar  8 17:00 c.php

返回完整輸出,含 total 統計行。

進階用法:exec() 獲取完整輸出與退出碼

<?php
$output = [];
$return_code = 0;
$last_line = exec('/bin/ls -l', $output, $return_code);

echo "最後一行: $last_line\n";
echo "退出碼: $return_code\n";
echo "完整輸出:\n";
print_r($output);
?>

安全性警示

  1. 命令注入風險:絕不直接拼接用戶輸入,必須使用 escapeshellarg()、escapeshellcmd()
  2. 權限最小化:Web 進程用戶權限應極度受限
  3. 禁用危險函式:php.ini 中 disable_functions = exec,shell_exec,system,passthru,popen,proc_open
  4. 審計日誌:記錄所有命令執行請求

選擇建議

  • 需完整輸出(日誌、列表、報表)→ shell_exec()
  • 需退出碼判斷成敗 → exec() + 第三參數
  • 需逐行處理大量輸出 → popen() 流式讀取
  • 長時間運行任務 → 背景進程 + 隊列系統(如 Gearman、Redis Queue)

理解這兩個函式的本質差異,能避免「明明命令正確卻拿不到預期結果」的常見坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved