在PHP中調用外部命令可以通過以下三種方式實現:
方法壹:使用PHP提供的特殊函數(四):
PHP提供了四個執行外部命令的特殊函數:exec()、system()、passthru()和shell _ exec()。
1)執行()
原型:string exec (string $ command [,array & amp;$output [,int & amp$return_var ]])
註意:exec在執行系統的外部命令時不會輸出結果,但會返回結果的最後壹行。如果想得到結果,可以使用第二個參數將其輸出到指定的數組。該數組中的壹條記錄代表壹行輸出。即如果輸出結果有20行,數組有20條記錄,那麽如果需要重復輸出調用系統不同外部命令的結果,最好在輸出系統每個外部命令的結果時,將數組unset($output)清零,防止混淆。第三個參數用於獲取命令執行的狀態代碼,當命令成功執行時,通常返回0。
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
exec("dir ",$ output);
print _ r($ output);
& gt
2)系統()
原型:String system (string $ command [,int & amp;$return_var ])
說明:system和exec的區別在於,當系統執行系統的外部命令時,直接將結果輸出到瀏覽器,命令執行成功則返回true,否則返回false。第二個參數與exec的第三個參數含義相同。
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
系統(“pwd”);
& gt
3)直通()
原型:void passthru (string $ command [,int & amp;$return_var ])
描述:passthru和system的區別在於passthru直接將結果輸出給查看器,不返回任何值,它可以輸出二進制,比如圖像數據。第二個參數是可選的,是狀態代碼。
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
header(" Content-type:image/gif ");
passthru("/usr/bin/ppm 2 tiff/usr/share/tk 8.4/demos/images/tea茶壺. ppm ");
& gt
4)shell_exec()
原型:字符串shell_exec(字符串$cmd)
描述:直接執行命令$cmd
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
$ output = shell _ exec(' ls-lart ');
回聲" & ltpre & gt$ output & lt/pre >;;
& gt
方法2:反撇號
Prototype:反撇號`(和~同調)執行系統的外部命令。
註意:使用此方法執行外部系統命令時,請確保shell_exec函數可用,否則無法使用此撇號執行外部系統命令。
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
echo `dir ';
& gt
方法三:用popen()函數打開進程。
原型:資源popen(字符串$命令,字符串$模式)
描述:能夠與命令交互。之前介紹的方法只能簡單的執行命令,不能與之交互。有時會在命令中輸入壹些內容。比如添加系統用戶時,調用su將當前用戶改為root,su命令必須在命令行輸入root的密碼。在這種情況下,顯然不能使用前面提到的方法。
popen()函數打開壹個進程管道來執行壹個給定的命令,並返回壹個文件句柄,該句柄是可讀寫的。返回值與fopen()函數相同,它返回壹個文件指針。除非使用單壹模式打開(讀或寫),否則必須使用pclose()函數關閉。這個指針可以被fgets()、fgetss()和fwrite()調用。出現錯誤時返回FALSE。
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
錯誤報告(E _ ALL);
/*添加重定向以便我們可以獲取stderr。*/
$ handle = popen('/path/to/executable 2 & gt;& amp1 ',' r ');
回顯“$handle”。gettype($handle)。”\ n”;
$read = fread($handle,2096);
echo $ read
pclose($ handle);
& gt
有兩個問題需要考慮:安全性和超時。
1)安全性
因為PHP基本上是用於WEB程序開發的,所以安全性成為了人們考慮的壹個重要方面。於是PHP的設計者們給PHP加了壹道門:安全模式。如果在安全模式下運行,PHP腳本將受到以下四個方面的限制:
執行外部命令
打開文件時有壹些限制。
連接MySQL數據庫
基於HTTP的身份驗證
在安全模式下,只能執行特定目錄下的外部程序,對其他程序的調用將被拒絕。這個目錄可以通過在PhP.ini文件中使用safe_mode_exec_dir指令來指定,或者在編譯PhP時添加-with-exec-dir選項來指定。
當使用這些函數執行系統命令時,可以使用escapeshellcmd()和escapeshellarg()函數來防止用戶在系統上惡意執行命令。escapeshellcmd()針對的是執行的系統命令,而escapeshellarg()針對的是執行的系統命令的參數。這兩個參數有點類似於addslashes()的函數。
2)超時
當執行命令的返回結果非常大時,可能需要考慮將返回結果導出到其他文件中,然後單獨讀取文件,這樣可以顯著提高程序執行的效率。
如果要執行的命令需要很長時間,應該放在系統後臺運行。但默認情況下,system()等函數會壹直等到命令結束(實際上是等待命令的輸出結果),這肯定會導致PHP腳本超時。解決方案是將命令的輸出重定向到另壹個文件或流,例如:
& lt?服務器端編程語言(Professional Hypertext Preprocessor的縮寫)
system("/usr/local/bin/order _ proc & gt;/tmp/ABC ");
& gt
但是我調用的DOS命令需要幾分鐘,結果不能簡單的寫入壹個文件進行批處理。以下程序應按順序執行。
PHP為調用系統命令設置了時間限制。如果超時調用命令,雖然命令還是會執行,但是PHP沒有返回值,被終止(最可恨的是不顯示錯誤)。
修改php.ini並重啟Apache以允許系統命令運行更長時間。
最大執行時間= 600
我的程序在後臺運行,所以邏輯還可以。