溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在PHP項(xiàng)目中啟動(dòng)windows應(yīng)用程序

發(fā)布時(shí)間:2021-03-15 15:54:48 來源:億速云 閱讀:388 作者:Leah 欄目:開發(fā)技術(shù)

怎么在PHP項(xiàng)目中啟動(dòng)windows應(yīng)用程序?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

exec 或者 system 都可以調(diào)用cmd 的命令

直接上代碼:

<?php
/** 打開windows的計(jì)算器 */
exec('start C:WindowsSystem32calc.exe');

/** php生成windows的批處理文件后,再執(zhí)行這個(gè)批處理文件*/
$filename = 't.bat';
$somecontent = 'C:
';
$somecontent .= 'cd "C:/Program Files/MySQL-Front"';
$somecontent .= '
start MySQL-Front.exe';
if (!$handle = fopen($filename, 'w')) {
 echo "不能打開文件 $filename";
 exit;
}

/** 首先我們要確定文件存在并且可寫*/
if (is_writable($filename)) {

 /** 那就是當(dāng)我們使用fwrite()的時(shí)候,$somecontent將要寫入的地方
  將$somecontent寫入到我們打開的文件中 。*/
 if (fwrite($handle, $somecontent) === FALSE) {
  echo "不能寫入到文件 $filename";
  exit;
 }
 echo "成功地將 $somecontent 寫入到文件 $filename";
 fclose($handle);
} else {
 echo "文件 $filename 不可寫";
}
exec($filename);
?>

有一個(gè)遺留問題,就是exec()調(diào)用,php會(huì)一直執(zhí)行,直到你關(guān)閉啟動(dòng)的應(yīng)用程序,這樣會(huì)造成php執(zhí)行超時(shí),不知道怎么解決這個(gè)問題,希望高手路過此地,留下答案!我日后解決了,也會(huì)更新到這里的!

以下來自資料

=================================================

php的內(nèi)置函數(shù)exec,system都可以調(diào)用系統(tǒng)命令(shell命令),當(dāng)然還有passthru,escapeshellcmd等函數(shù)。

在很多時(shí)候利用php的exec,system等函數(shù)調(diào)用系統(tǒng)命令可以幫助我們更好更快的完成工作。

注意:要想使用這二個(gè)函數(shù) php.ini 中的安全模式必須關(guān)閉,要不然為了安全起見php是不讓調(diào)用系統(tǒng)命令的。

先看一下php手冊(cè)對(duì)這二個(gè)函數(shù)的解釋:

exec --- 執(zhí)行外部程式

語法 : string exec ( string command [, array &output [, int &return_var]] )

說明 :
exec()執(zhí)行給予的命令command,不過它并不會(huì)輸出任何東西,它簡單的從命令的結(jié)果中傳回最后一行,如果你需要去執(zhí)行一個(gè)命令,并且從命令去取得所有資料時(shí),可以使用passthru()這個(gè)函數(shù)。
如果有給予參數(shù)array,則指定的數(shù)組將會(huì)被命令所輸出的每一行填滿,注意 : 如果數(shù)組先前已經(jīng)包含了一些元素的話,exec()將會(huì)把它附加在數(shù)組的后面,如果你不想要此函數(shù)附加元素的話,你可以在傳遞此數(shù)組給exec()之前呼叫unset()。
如果有給予參數(shù)array和return_var,則傳回執(zhí)行的狀態(tài)命令將會(huì)寫到這個(gè)變量。

注意: 如果你允許來自使用者輸入的資料,可以傳遞到此函數(shù),那么你應(yīng)該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統(tǒng)來執(zhí)行武斷的(arbitrary)命令。

注意: 如果你使用此函數(shù)來啟動(dòng)一個(gè)程式,而且希望在背景里(background)執(zhí)行的時(shí)候離開它,你必須確定此程式的輸出是轉(zhuǎn)向(redirected)到一個(gè)文件或是一些輸出的資料流,否則PHP將會(huì)懸掛(hang)直到程式執(zhí)行結(jié)束。

system --- 執(zhí)行外部程式并且顯示輸出

語法:string system ( string command [, int &return_var] )

說明:

system( )執(zhí)行給予的命令command,并且輸出結(jié)果。如果有給予參數(shù)return_var,則執(zhí)行命令的狀態(tài)碼將會(huì)寫到這個(gè)變量。

注意: 如果你允許來自使用者輸入的資料,可以傳遞到此函數(shù),那么你應(yīng)該使用escapeshellcmd( )來確定此使用者無法哄騙(trick)系統(tǒng)來執(zhí)行武斷的(arbitrary)命令。

注意: 如果你使用此函數(shù)來啟動(dòng)一個(gè)程式,而且希望在背景里(background)執(zhí)行的時(shí)候離開它,你必須確定此程式的輸出是轉(zhuǎn)向(redirected)到一個(gè)文件或是一些輸出的資料流,否則PHP將會(huì)懸掛(hang)直到程式執(zhí)行結(jié)束。
如果PHP是運(yùn)作成伺服器模組,在輸出每一行后,system( )會(huì)試著自動(dòng)地清除web伺服器的輸出緩沖。

成功則傳回命令的最后一行,失敗則傳回false。

如果你需要去執(zhí)行一個(gè)命令,并且從命令去取得所有資料時(shí),可以使用passthru( )這個(gè)函數(shù)。

這二個(gè)都是用來調(diào)用系統(tǒng)shell命令,

不同點(diǎn):

exec可以把執(zhí)行的結(jié)果全部返回到$output函數(shù)里(數(shù)組),$status是執(zhí)行的狀態(tài) 0為成功 1為失敗

systerm不需要提供$output函數(shù),他是直接把結(jié)果返回出來,同樣$return_var是執(zhí)行的狀態(tài)碼 0為成功 1為失敗

exec示例:

復(fù)制代碼 代碼如下:


<?php
 $a = exec("dir", $out, $status);
 print_r($a);
 print_r($out);
 print_r($status);
?>


system示例:

復(fù)制代碼 代碼如下:


<?php
 $a = system("dir", $status);
 print_r($a);
 print_r($status);
?>

上面說明看起來有點(diǎn)亂,運(yùn)行兩個(gè)例子后,你就會(huì)明白的!

【system】

復(fù)制代碼 代碼如下:


<?php
set_time_limit(0);
define('ROOT_PATH', dirname(__FILE__));

include ROOT_PATH . '/include/global.func.php';

$cmdTest = 'ps -ef | grep magent';

$lastLine = system($cmdTest, $retVal);

write_log('$lastLine');
write_log($lastLine);

write_log('$retVal');
write_log($retVal);
?>

輸出:

復(fù)制代碼 代碼如下:


++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:28:52
$lastLine
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:28:52
root      5375  5373  0 16:28 pts/1    00:00:00 grep magent
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:28:52
$retVal
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:28:52
0

【exec】

復(fù)制代碼 代碼如下:


<?php
set_time_limit(0);
define('ROOT_PATH', dirname(__FILE__));

include ROOT_PATH . '/include/global.func.php';

$cmdTest = 'ps -ef | grep magent';

$lastLine = exec($cmdTest, $output, $retVal);

write_log('$lastLine');
write_log($lastLine);

write_log('$output');
write_log($output);

write_log('$retVal');
write_log($retVal);
?>

輸出:

復(fù)制代碼 代碼如下:


++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
$lastLine
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
root      5360  5358  0 16:25 pts/1    00:00:00 grep magent
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
$output
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
Array
(
    [0] => root      2838     1  0 15:39 ?        00:00:00 magent -u root -n 51200 -l 192.168.137.100 -p 12001 -s 192.168.137.100:11211 -b 192.168.137.100:11212
    [1] => root      5358  5356  0 16:25 pts/1    00:00:00 sh -c ps -ef | grep magent
    [2] => root      5360  5358  0 16:25 pts/1    00:00:00 grep magent
)

++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
$retVal
++++++++++++++++++++++++++++++++++++++++++
2014-10-15 16:25:00
0

看完上述內(nèi)容,你們掌握怎么在PHP項(xiàng)目中啟動(dòng)windows應(yīng)用程序的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI