準備工做php
出於安全性考慮,在一般狀況下虛擬主機、XAMPP、DedeAMPZ等PHP運行環境都是禁止調用系統外部命令的。因此當你須要使用PHP執行命令的函數調用系統外部命令時,你須要確保PHP運行環境支持PHP執行命令的函數。shell
若是你使用的是XAMPP、DedeAMPZ,通常默認是禁止運行PHP執行命令的函數的,你能夠在php.ini配置文件中disable_functions一項中去除你想要使用的函數,而後重啓apache便可。我使用的是DedeAMPZ,因此我去除了exec()、passthru()、system()、shell_exec()這四個函數。PHP運行環境如何配置?apache
若是你的PHP運行環境是自行配置的,默認php.ini配置文件中是不由止你調用執行外部命令的函數的,固然出於安全考慮,你仍是應該禁止調用一部分執行系統外部命令的函數,找到disable_functions,配置以下:數組
disable_functions = exec,system,passthru,shell_exec安全
方法一:使用exec函數執行系統外部命令函數
原型:function exec(string $command,array[optional] $output,int[optional] $return_value)spa
<?php exec("dir",$output); print_r($output); ?>
知識點:exec執行系統外部命令時不會輸出結果,而是返回結果的最後一行,若是你想獲得結果你可使用第二個參數,讓其輸出到指定的數組,此數組一個記錄表明輸出的一行,即若是輸出結果有20行,則這個數組就有20條記錄,因此若是你須要反覆輸出調用不一樣系統外部命令的結果,你最好在輸出每一條系統外部命令結果時清空這個數組,以防混亂。第三個參數用來取得命令執行的狀態碼,一般執行成功都是返回0。code
方法二:使用system函數執行系統外部命令orm
原型:function system(string $command,int[optional] $return_value)get
<?php system("dir"); ?>
知識點:system和exec的區別在於system在執行系統外部命令時,直接將結果輸出到遊覽器,若是執行命令成功則返回true,不然返回false。第二個參數與exec第三個參數含義同樣。
方法三:使用函數passthru執行系統外部命令
原型:function passthru(string $command,int[optional] $return_value)
<?php passthru("dir"); ?>
知識點:passthru與system的區別,passthru直接將結果輸出到遊覽器,不返回任何值,且其能夠輸出二進制,好比圖像數據。
方法四:反撇號`(和~在同一個鍵)執行系統外部命令
安全性說明
當你使用這些函數執行命令時,若是是根據用戶提交數據做爲執行命令的話,你須要考慮系統安全性,可使用escapeshellcmd()和escapeshellarg()函數阻止用戶惡意在系統上執行命令,escapeshellcmd()針對的是執行的系統命令,而escapeshellarg()針對的是執行系統命令的參數。這兩個參數有點相似addslashes()的功能。
其餘說明
當執行命令的返回結果很是龐大時,能夠須要考慮將返回結果輸出至其餘文件,再另行讀取文件,這樣能夠顯著提升程序執行的效率。即
<?php system("dir > leapsoulcn.txt"); ?>
說明:這裏system執行命令時並不將結果直接輸出至遊覽器而是輸出至指定目錄下的文件中,顯著提升了程序執行的效率。