PHP執行外部程式的方法

2021-09-16 23:46:01 字數 3652 閱讀 9304

在一些特殊情況下,會使用php呼叫外部程式執行,比如:呼叫shell命令、shell指令碼、可執行程式等等,今天在原始碼中了解了一下php執行外部程式的方法,藉此機會順便整理一下。

在原始碼中 exec.**件中,列出了可呼叫外部程式的幾個函式,藍色框裡的兩個函式只是輔助作用,本文只對其他幾個函式做介紹。

前提

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用來儲存命令執行的狀態碼(用來檢測成功或失敗)。

例子:

<?php 

exec('whoami',$output, $status);

var_dump($output);

exit;

// 輸出結果:

array(1)

注意:

① 輸出結果會逐行追加到$output中,因此在呼叫exec之前需要unset($output),特別是迴圈呼叫的時候。

② 如果想通過exec呼叫外部程式後馬上繼續執行後續**,僅僅在命令裡加"&"是不夠的,此時exec依然會等待命令執行完畢;需要再將標準輸出做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);

shell_exec() 函式

原型:string shell_exec( string command)

描述:通過 shell 環境執行命令,並且將完整的輸出以字串的方式返回。

例子:

<?php 

$output = shell_exec('whoami');

echo "$output"; // hedong

exit;

注意:

當程序執行過程中發生錯誤,或者程序不產生輸出的情況下,都會返回 null, 所以,使用本函式無法通過返回值檢測程序是否成功執行。 如果需要檢查程序執行的退出碼,請使用 exec() 函式。

system() 函式

原型:string system ( string command [, int &return_var] )

描述:執行給定的命令,返回最後的輸出結果;第二個引數是可選的,用來得到命令執行後的狀態碼。

例子:

<?php 

system("whoami", $status); // 直接輸出

var_dump($status); // 成功時狀態碼是 0

exit;

// 輸出結果:hedong

passthru() 函式原型:void passthru (string command [, int return_var])

描述:執行給定的命令,但不返回任何輸出結果,而是直接輸出到顯示裝置上;第二個引數可選,用來得到命令執行後的狀態碼。

用途:當所執行的 unix 命令輸出二進位制資料, 並且需要直接傳送到瀏覽器的時候, 需要用此函式來替代 exec() 或 system() 函式

例子:

<?php 

passthru("whoami", $status); // 直接輸出

var_dump($status); // 成功時狀態碼是 0

exit;

輸出結果:hedong

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類似,但是可以提供雙向管道。

例子:

<?php 

/** * @author: hedong

* @date 2017-04-04

*/// 管道配置

$descriptors = array(

0 => array("pipe", "r"),

1 => array("pipe", "w")

);$process = proc_open("php", $descriptors, $pipes);

if (is_resource($process)) else ");

fwrite($pipes[0], "?>");

fclose($pipes[0]);

$output = "";

while (!feof($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多程序程式設計

PHP執行外部程式的方法

在一些特殊情況下,會使用php呼叫外部程式執行,比如 呼叫shell命令 shell指令碼 可執行程式等等 php執行外部程式的方法 這些函式的使用前提 exec 執行乙個外部程式 passthru 執行外部程式並且顯示原始輸出 popen 開啟程序檔案指標,fork乙個子程序,返回檔案指標 esc...

vc中執行外部程式的方法

closehandle processinfo.hthread closehandle processinfo.hprocess return true return bret winexec 針對16位程式而保留的.shellexecute 標準的呼叫外部程式函式,一般應該用這個.shellexe...

vc中執行外部程式的方法

closehandle processinfo.hthread closehandle processinfo.hprocess return true return bret winexec 針對16位程式而保留的.shellexecute 標準的呼叫外部程式函式,一般應該用這個.shellexe...