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