摘要:注意執行外部程序是存在風險的,所以使用這些函數要在確保安全的情況下使用。例子注意當進程執行過程中發生錯誤,或者進程不產生輸出的情況下,都會返回,所以,使用本函數無法通過返回值檢測進程是否成功執行。
在一些特殊情況下,會使用PHP調用外部程序執行,比如:調用shell命令、shell腳本、可執行程序等等,今天在源碼中了解了一下PHP執行外部程序的方法,借此機會順便整理一下。
在源碼中 exec.h文件中,列出了可調用外部程序的幾個函數,藍色框里的兩個函數只是輔助作用,本文只對其他幾個函數做介紹。
前提
1 PHP沒有運行在安全模式,關掉安全模式,即:safe_mode = off 2 禁用函數列表 disable_functions = exec, system, shell_exec,proc_open, popen, 如果禁用了,就關掉。
注意:執行外部程序是存在風險的,所以使用這些函數要在確保安全的情況下使用。
exec() 函數
原型:string exec ( string command [, array &output [, int &return_var]] )
描述:返回值保存最后的輸出結果,而所有輸出結果將會保存到$output數組,$return_var用來保存命令執行的狀態碼(用來檢測成功或失敗)。
例子:
string(7) "hedong" }
注意:
① 輸出結果會逐行追加到$output中,因此在調用exec之前需要unset($output),特別是循環調用的時候。
② 如果想通過exec調用外部程序后馬上繼續執行后續代碼,僅僅在命令里加"&"是不夠的,此時exec依然會等待命令執行完畢;需要再將標準輸出做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);
shell_exec() 函數
原型:string shell_exec( string command)
描述:通過 shell 環境執行命令,并且將完整的輸出以字符串的方式返回。
例子:
注意:
當進程執行過程中發生錯誤,或者進程不產生輸出的情況下,都會返回 NULL, 所以,使用本函數無法通過返回值檢測進程是否成功執行。 如果需要檢查進程執行的退出碼,請使用 exec() 函數。
system() 函數
原型:string system ( string command [, int &return_var] )
描述:執行給定的命令,返回最后的輸出結果;第二個參數是可選的,用來得到命令執行后的狀態碼。
例子:passthru() 函數
原型:void passthru (string command [, int return_var])
描述:執行給定的命令,但不返回任何輸出結果,而是直接輸出到顯示設備上;第二個參數可選,用來得到命令執行后的狀態碼。用途:當所執行的 Unix 命令輸出二進制數據, 并且需要直接傳送到瀏覽器的時候, 需要用此函數來替代 exec() 或 system() 函數
例子:
popen() 函數
原型:resource popen ( string command, string mode )
描述:打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。 返回一個和 fopen() 所返回的相同的文件指針,只不過它是單向的(只能用于讀或寫)并且必須用 pclose() 來關閉。此指針可以用于 fgets(),fgetss() 和 fwrite()。
例子:$fd = popen("command", "r"); $ret = fgets($fd);注意:只能打開單向管道,不是"r"就是"w";并且需要使用pclose()來關閉。
proc_open() 函數
原型:resource proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )
描述:與popen類似,但是可以提供雙向管道。
例子:array("pipe", "r"), 1 => array("pipe", "w") ); $process = proc_open("php", $descriptors, $pipes); if (is_resource($process)) { fwrite($pipes[0], ""); fclose($pipes[0]); $output = ""; while (!feof($pipes[1])) { $output .= fgets($pipes[1]); } $output = strtoupper($output); echo $output; fclose($pipes[1]); proc_close($process); } // 輸出結果: GOODBYE, WORLD!注意:
① 后面需要使用proc_close()關閉資源,并且如果是pipe類型,需要用pclose()關閉句柄。
② proc_open打開的程序作為php的子進程,php退出后該子進程也會退出。總結:
exec函數將輸出結果保存在第二個參數上;
shell_exec函數沒有參數中接收返回值,而且沒有執行成功的狀態碼;
system函數將執行的結果直接輸出;passthru函數同system函數,不同之處是適合處理輸出二進制數據;
popen函數會fork一個子進程,返回文件指針
proc_open函數同popen,但可提供雙向通道
關注我的公眾號,一起成長
推薦閱讀:PHP多進程編程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22668.html
摘要:相同點都可以獲得命令執行的狀態碼作為一種服務器端的腳本語言,象編寫簡單,或者是復雜的動態網頁這樣的任務,它完全能夠勝任。于是的設計者們給加了一個門安全模式。第二個參數是可選的,用來得到命令執行后的狀態碼。 詳細的介紹了關于PHP exec system passthru系統函數用法與安全以及其它應用功能,有需要的朋友參考一下。區別:system() 輸出并返回最后一行shell結果。e...
摘要:怎樣才算是高性能的應用性能和速度不是一對同義詞。紅線表示針對速度進行了優化的腳本,藍線是可擴展性優先的腳本。將任何這些功能置于循環中可能會導致性能問題。完整的代碼檢測評估雖然可能很耗時,但它可以為你提供有關應用程序性能的深入信息。 showImg(https://segmentfault.com/img/bVNxDn?w=900&h=500);程序員都喜歡最新的PHP 7,因為它使PH...
摘要:一常見網站安全漏洞對于的漏洞,目前常見的漏洞有五種。分別是文件漏洞注入漏洞腳本命令執行漏洞全局變量漏洞和文件漏洞。這就是月行胃的注入漏洞。 一、常見PHP網站安全漏洞 對于PHP的漏洞,目前常見的漏洞有五種。分別是Session文件漏洞、SQL注入漏洞、腳本命令執行漏洞、全局變量漏洞和文件漏洞。這里分別對這些漏洞進行簡要的介紹。 1、session文件漏洞 Session攻擊是黑客最常...
摘要:簡介注釋標簽在代碼注釋中的作用非常大,但是可能很多同學在平常開發中會忽略這些標簽的作用,所以我這邊特地整理一些常用的注釋標記,通過圖文展現形式,希望能幫助你能更好理解每個注釋標簽的作用或許你離漂亮的代碼,就差一個標簽項目工程地址被此標記的 簡介 注釋標簽在代碼注釋中的作用非常大,但是可能很多同學在平常開發中會忽略這些標簽的作用,所以我這邊特地整理一些常用的注釋標記,通過圖文展現形式,希...
閱讀 2041·2023-04-25 15:11
閱讀 3462·2021-09-23 11:57
閱讀 1372·2021-07-26 23:38
閱讀 1319·2019-08-30 15:54
閱讀 635·2019-08-30 15:53
閱讀 3245·2019-08-26 13:36
閱讀 986·2019-08-26 12:01
閱讀 2863·2019-08-23 16:21