PHPがwindowsアプリケーションを起動し、batバッチを実行し、cmdコマンドを実行する方法(exec、system関数詳細)

6117 ワード

execまたはsystemはcmdのコマンドを呼び出すことができます
直接コード:
 
  
/** windows */
exec('start C:WindowsSystem32calc.exe');

/** php windows , */
$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)) {

 /** fwrite() ,$somecontent
   $somecontent 。*/
 if (fwrite($handle, $somecontent) === FALSE) {
  echo " $filename";
  exit;
 }
 echo " $somecontent $filename";
 fclose($handle);
} else {
 echo " $filename ";
}
exec($filename);
?>


残された問題はexec()呼び出しで、phpは起動したアプリケーションを閉じるまで実行され、php実行がタイムアウトになります.この問題をどのように解決するか分かりません.達人がここを通って、答えを残してほしいです.私は後日解決して、ここにも更新します!
以下は資料より
=================================================
phpの内蔵関数exec,systemはシステムコマンド(shellコマンド)を呼び出すことができ,もちろんpassthru,escapeshellcmdなどの関数もある.
phpのexec、systemなどの関数を使用してシステムコマンドを呼び出すことは、より迅速に作業を完了するのに役立ちます.
注意:この2つの関数phpを使用するには.iniのセキュリティモードはオフにする必要があります.そうしないと、phpはセキュリティのためにシステムコマンドを呼び出さないようにします.
まずphpマニュアルのこの2つの関数の解釈を見てみましょう.
exec---外部プログラムの実行
構文:string exec(string command[,array&output[,int&return_var]])
説明:exec()は与えられたコマンドcommandを実行しますが、何も出力しません.コマンドの結果から最後の行に簡単に戻ります.コマンドを実行し、コマンドからすべての資料を取得する必要がある場合はpassthru()という関数を使用します.パラメータarrayが付与されている場合、指定された配列はコマンド出力の各行で満たされます.配列に以前にいくつかの要素が含まれている場合、exec()は配列の後ろに添付されます.この関数に要素を追加したくない場合は、exec()に渡す前にunset()を呼び出すことができます.パラメータarrayとreturnが与えられている場合varでは、実行されたステータスコマンドを返してこの変数に書きます.
注意:ユーザーから入力した資料を許可して、この関数に渡すことができる場合は、escapeshellcmd()を使用して、このユーザーがシステムをだまして武断的な(arbitrary)コマンドを実行できないことを決定する必要があります.
注意:この関数を使用してプログラムを起動し、バックグラウンドで実行するときに離れる場合は、プログラムの出力がファイルまたは出力のデータストリームに転向していることを確認する必要があります.そうしないと、PHPはプログラムの実行が終了するまでサスペンションされます.
System---外部プログラムを実行し出力を表示する
構文:string system(string command[,int&return_var])
説明:
System()は、与えられたコマンドcommandを実行し、結果を出力する.与えられたパラメータreturn_がある場合varでは、コマンドを実行するステータスコードがこの変数に書き込まれます.
注意:ユーザーから入力した資料を許可して、この関数に渡すことができる場合は、escapeshellcmd()を使用して、このユーザーがシステムをだまして武断的な(arbitrary)コマンドを実行できないことを決定する必要があります.
注意:この関数を使用してプログラムを起動し、バックグラウンドで実行するときに離れる場合は、プログラムの出力がファイルまたは出力のデータストリームに転向していることを確認する必要があります.そうしないと、PHPはプログラムの実行が終了するまでサスペンションされます.PHPがサーバーモジュールとして動作する場合、各行を出力した後、system()はwebサーバーの出力バッファを自動的にクリアしようとします.
成功するとコマンドの最後の行に戻り、失敗するとfalseに戻ります.
コマンドを実行し、コマンドからすべての資料を取得する必要がある場合はpassthru()という関数を使用します.
どちらもシステムshellコマンドを呼び出すために使用されます.
相違点:
execは実行結果をすべて$output関数(配列)に戻すことができ、$statusは実行状態0が成功1が失敗
Systermは$output関数を提供する必要はありません.彼は直接結果を返します.同じ$return_varは実行されたステータスコード0が成功1が失敗
execの例:
 
  
 $a = exec("dir", $out, $status);
 print_r($a);
 print_r($out);
 print_r($status);
?>

システムの例:
 
  
 $a = system("dir", $status);
 print_r($a);
 print_r($status);
?>

上の説明は少し乱れているように見えますが、2つの例を実行するとわかります!
【system】
 
  
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);
?>


出力:
 
  
++++++++++++++++++++++++++++++++++++++++++
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】
 
  
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);
?>


出力:
 
  
++++++++++++++++++++++++++++++++++++++++++
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


結論:
詳細な出力結果が必要な場合はexec()を使いましょう.私は普通exec()で外部コマンドを実行します!
参照先:
http://php.net/manual/zh/function.system.php http://php.net/manual/zh/function.exec.php