本篇記錄 PHP 使用 system()、exec()、shell_exec() 執行 shell 的方法和差異,
- system()
依據官方的說明,system 會自動更新在 shell 內的每一行輸出更新
The system() call also tries to automatically flush the web server’s output buffer after each line of output if PHP is running as a server module.
<?php system('ls -al', $out); var_dump($out); header('Content-type: application/json'); ?> #output total 20 drwxr-xr-x 3 nginx nginx 4096 Jun 30 10:37 . drwxr-xr-x. 11 root root 4096 Jun 26 00:42 .. -rw-r--r-- 1 nginx nginx 816 Jun 30 10:36 cmd.php -rw-r--r-- 1 nginx nginx 246 May 4 12:15 index.php drwxr-xr-x 6 nginx nginx 4096 May 19 17:32 share int(0)
- exec()
exec 將回傳的內容儲存在變數,並且為 array 的格式,適合用於處理參數
<?php exec('ls -al', $out); var_dump($out); header('Content-type: application/json'); ?> #output array(6) { [0]=> string(8) "total 20" [1]=> string(46) "drwxr-xr-x 3 nginx nginx 4096 Jun 30 10:45 ." [2]=> string(47) "drwxr-xr-x. 11 root root 4096 Jun 26 00:42 .." [3]=> string(52) "-rw-r--r-- 1 nginx nginx 811 Jun 30 10:45 cmd.php" [4]=> string(54) "-rw-r--r-- 1 nginx nginx 246 May 4 12:15 index.php" [5]=> string(50) "drwxr-xr-x 6 nginx nginx 4096 May 19 17:32 share" }
- shell_exec()
shell_exec 將回傳的內容儲存在變數,並且為純文字內容
<?php $out = shell_exec('ls -al'); var_dump($out); header('Content-type: application/json'); ?> #output string(263) "total 20 drwxr-xr-x 3 nginx nginx 4096 Jun 30 10:49 . drwxr-xr-x. 11 root root 4096 Jun 26 00:42 .. -rw-r--r-- 1 nginx nginx 817 Jun 30 10:49 cmd.php -rw-r--r-- 1 nginx nginx 246 May 4 12:15 index.php drwxr-xr-x 6 nginx nginx 4096 May 19 17:32 share "
從範例看到幾種執行 shell 的差異,然後再選擇需要的 function 使用。
參考資料:
PHP system()、exec()、shell_exec() 的 差異