瞭解命令的區別並進行直觀的選擇 這是一篇翻譯文章,原做者經過表格的形式更加直觀的展示出差別並進行選擇php
前言
PHP有衆多調用系統命令的函數,大體以下:shell
- system()
- exec()
- passthru()
- shell_exec()
- ``
因而就想着總結一下它們的差別。本想着對照手冊把它們的函數功能,參數,返回等都列出來,可是其實不利於直觀看出差別來。谷歌上發現大多數人跟我想的同樣,更側重於函數功能的介紹。因而經過stack overflow,終於發現了滿意的答案,雖然答案簡短可是直觀,因而準備翻譯一下,原文地址:http://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru#answer-39681338瀏覽器
原文翻譯
先前的回答看起來有點疑惑、不完整(譯註:其餘回答通篇文字說明),所以如下表總結了區別:安全
Command | Displays Output | Can Get Output | Gets Exit Code |
---|---|---|---|
system() | Yes(text) | Last line only | Yes |
passthru | Yes(raw) | No | Yes |
exec | No | Yes (array) | Yes |
shell_exec | No | Yes (string) | No |
backticks(``) | No | Yes (string) | No |
- 'Displays Output'意味着它將輸出流輸出到瀏覽器(或者若是在命令行運行,就在命令行輸出)
- 'Can Get Output'意味着你能夠獲取到命令的輸出並分配給PHP變量
- 'The "exit code'是一個命令返回的特殊值(也叫作'返回狀態'),'0'意味着成功,其餘值一般是錯誤碼
其餘易混淆的注意事項:函數
- shell_exec()和執行操做符(``)功能是同樣的
- 可使用proc_open()和popen()交互式讀/寫數據流
- 如你想要捕獲、展現錯誤信息,命令增長'2>&1'
- 使用escapeshellcmd()過濾可能包含問題字符的命令的參數
- 若是exec傳入$output變量存儲輸出,若是$output變量不爲空,輸出內容將會插入到$output變量中(譯註:$output參數是引用傳值的)。因此你可能首先要刪除($output)。
翻譯完。url
附加內容:安全性
任何腳本都須要在安全的環境下執行,PHP提供了兩個函數來保證執行系統命令的安全。spa
1.escapeshellcmd()-shell 元字符轉義
說明:對字符串中可能會欺騙 shell 命令執行任意命令的字符進行轉義。反斜線(\)會在如下字符以前插入: #&;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ' 和 " 僅在不配對兒的時候被轉義。 在 Windows 平臺上,全部這些字符以及 % 都會被空格代替。.net
2.escapeshellarg()-把字符串轉碼爲能夠在 shell 命令裏使用的參數
說明:將給字符串增長一個單引號而且能引用或者轉碼任何已經存在的單引號,這樣以確保可以直接將一個字符串傳入 shell 函數,而且仍是確保安全的。對於用戶輸入的部分參數就應該使用這個函數。命令行