『壹』 在伺服器上用php調用cmd執行某exe文件,求代碼!!!!
很多情況下需要php調用其他程序如shell命令、shell腳本、可執行程序等等,此時需要使用到諸如exec/system/popen/proc_open等函數,每種函數有各自適合使用的場景以及需要注意的地方。
前提:PHP沒有運行在安全模式
如果PHP運行在安全模式下,那麼在執行外部命令、打開文件、連接資料庫、基於HTTP的認證這4個方面將會受到制約,可能在調用外部程序時無法獲取預期的結果,此時需要設置特定目錄,可以在php.ini中編輯safe_mode_exec_dir參數來指定。
1. exec
原型:string exec ( string command [, array &output [, int &return_var]] )
描述:返回值保存最後的輸出結果,而所有輸出結果將會保存到$output數組,$return_var用來保存命令執行的狀態碼(用來檢測成功或失敗)。
例子:$ret = exec("ls -al", $output, $var);
注意:
A. 輸出結果會逐行追加到$output中,因此在調用exec之前需要unset($output),特別是循環調用的時候。
B.
如果想通過exec調用外部程序後馬上繼續執行後續代碼,僅僅在命令里加"&"是不夠的,此時exec依然會等待命令執行完畢;需要再將標准輸出
做重定向才可以,例如:exec("ls -al >/dev/null &", $output, $var);
C.
要學會善用EscapeShellCmd()和EscapeShellArg()。函數EscapeShellCmd把一個字元串
中所有可能瞞過Shell而去執行另外一個命令的字元轉義。這些字元在Shell中是有特殊含義的,象分號(|),重定向(>)和從文件讀入
(<)等。函數EscapeShellArg是用來處理命令的參數的。它在給定的字元串兩邊加上單引號,並把字元串中的單引號轉義,這樣這個字元串
就可以安全地作為命令的參數。
2. system
原型:string system ( string command [, int &return_var] )
描述:執行給定的命令,返回最後的輸出結果;第二個參數是可選的,用來得到命令執行後的狀態碼。
例子:$ret = system("ls -al", $var);
注意:略。
3. passthru
原型:void passthru (string command [, int return_var])
描述:執行給定的命令,但不返回任何輸出結果,而是直接輸出到顯示設備上;第二個參數可選,用來得到命令執行後的狀態碼。
例子:passthru("ls -al", $var);
注意:略。
4. popen
原型:resource popen ( string command, string mode )
描
述:打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。 返回一個和 fopen()
所返回的相同的文件指針,只不過它是單向的(只能用於讀或寫)並且必須用 pclose() 來關閉。此指針可以用於 fgets(),fgetss()
和 fwrite()。
例子:$fd = popen("command", 'r'); $ret = fgets($fd);
注意:只能打開單向管道,不是'r'就是'w';並且需要使用pclose()來關閉。
5. proc_open
原
型:resource proc_open ( string cmd, array descriptorspec, array
&pipes [, string cwd [, array env [, array other_options]]] )
描述:與popen類似,但是可以提供雙向管道。具體的參數讀者可以自己翻閱資料,比如該博客:http://hi..com/alex_wang58/blog/item/a28657de16fec55195ee372a.html。
注意:
A. 後面需要使用proc_close()關閉資源,並且如果是pipe類型,需要用pclose()關閉句柄。
B. proc_open打開的程序作為php的子進程,php退出後該子進程也會退出。
C. 筆
者在使用的時候遇到獲取外部程序輸出阻塞的問題,也就是在例子中的fgets($pipes[1])語句阻塞了,無法繼續進行。經過多方查證後發現,問題
一般出在外部程序中,比如外部程序是C程序,使用fprintf(stdin, "****
\n");輸出結果,此時需要加上fflush(stdout);才行,否則輸出結果可能會暫留緩存中,無法真正輸出,而php也就無法獲取輸出了。
例子:
///< 打開管道
$pwd = "*****";
$pipes = array();
$command = "*****";
$desc = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w'));
$handle = proc_open($command, $desc, $pipes, $pwd);
if (!is_resource($handle)) {
fprintf(STDERR, "proc_open failed.\n");
exit(1);
}
///< 讀寫
fwrite($pipes[0], "*****\n");
$ret = rtrim(fgets($pipes[1]), "\n");
///< 關閉管道
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($handle);
『貳』 php調用exe問題
PHP裡面exec其它命令可以成功執行,而調用特定的程序沒有成功,我推測有三個方面的原因:
一是APACHE的進程(估計是httpd.exe)身份與你命令行執行的是否相同,可以在進程管理器裡面查看。
二是環境不同,你的julia是否需要某些特定環境變數支持,PHP執行的時候這些環境變數是否都有,可以在PHPINFO()裡面查看。
三是相對路徑不同,命令行下執行時系統查找文件的環境不同,試試看這樣寫:
exec(" julia 12.jl");
修改為:
exec("c:\\julia\\julia.exe d:\\jl\\12.jl");
此外,你的調試信息顯示stderr異常,是否julia必須依賴stderr。還有,julia是CONSOLE環境還是GUI程序,如果是CONSOLE的,能否使用-?或者-v參數顯示簡單信息,用以測試調用julia是否成功,例如你的julia支持julia -version顯示版本號,那麼你可以在PHP裡面這樣寫:
exec(" julia -version");
查看命令行和瀏覽器裡面的效果。
『叄』 怎樣用PHP腳本調用安裝在Windows中的*.exe程序
在嘗試調用之前,至少你需要了解一定的知識才可以。
你的PHP環境是在Linux伺服器還是Windows伺服器上?如果是Linux伺服器,那麼是不支持exe程序運行的。
你的程序需要放在php文件能訪問的目錄中。當然,你必須能夠訪問PHP伺服器才可以。如果只是客戶端,那是沒用的。PHP不能訪問客戶端的程序。
system或者exec都可以執行文件。不過沒有嘗試Windows下訪問某個特定的程序。
下面是一個例子。使用exec執行『whoami』程序。
<?php
// outputs the username that owns the running php/httpd
process
// (on a system with the "whoami" executable in the
path)
echo exec('whoami');
?>
『肆』 php中有幾種方法引用另一個php文件又有什麼區別
有兩種方法引用岩顫亮另一個php文件。
PHP包括並要求語句。
使用include或require語句,您可以將PHP文件的內容插入另一個PHP文件(在伺服器執行洞碧該文件之前)。
除了錯誤處理外,包括和要求語句是相同的:
需要產生一個致命錯誤(E_COMPILE_ERROR)並停止腳本。
只包括生成警告(E_WARNING),腳本將繼續執行。
『伍』 php調用exe程序
php可以調用外部exe程序,如果是在伺服器端執行伺服器端的程序,使用exec函數。
提示一點:php是伺服器端腳本,因此,不能在客戶端執行伺服器端的程序。