當前位置:編程學習大全網 - 源碼下載 - Exec函數源代碼

Exec函數源代碼

PHP執行系統命令(簡介和方法)

在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

我的程序在後臺運行,所以邏輯還可以。

  • 上一篇:螺旋源代碼
  • 下一篇:qq號怎麽申請信用卡
  • copyright 2024編程學習大全網