私はこれを機能させることができないようです。
そのため、ゲーム名/タイプ/プレーヤーなどのいくつかのパラメーターを渡してサーバーに接続するゲームのスクリプトを作成しようとしています。次に、サーバースクリプトは、必要に応じてゲームサーバーの新しいインスタンスを設定し、サーバーの新しいインスタンスを実行し、実行されているポートを見つけて、そのすべての情報をゲームに送り返します。
スクリプトがサーバーゲームのexeを実行し、PIDを取得する必要がある部分に到達しました(使用しているポートなどを取得できます)。
サーバースクリプトは、サーバーの新しいインスタンスを実行するためのPHPスクリプトです。(PHPは良い選択のように思われ、比較的私の知識ではあります)。
スクリプトは、ゲームサーバーをバックグラウンドで実行したまま、実行を終了できる必要があります。
複数のゲームサーバーを同時に実行できることが必要です。
使用してみましproc_open
たが、プロセスのPIDが間違っているため、使用できません。(ただし、プログラムは正しく実行されます)
<?php
$startDir = "C:/Torque/My Projects/Grim/game";
$runExe = "$startDir/Grimwood.exe";
$envars = " -dedicated -mission \"core/levels/Empty Terrain.mis\"";
$runPath = $runExe . $envars;
chdir($startDir);
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
);
$prog = proc_open($runPath, $descriptorspec, $pipes, $startDir, NULL);
sleep(4);
if (is_resource($prog))
{
$stats = proc_get_status($prog);
$pid = $stats['pid'];
$task = shell_exec("tasklist /fi \"PID eq $pid\"");
echo("\nProcess: \n$task"); // echos cmd.exe, not process ran
}
?>
印刷するPIDは、実際に実行したプログラムではなく、実行元のコンソールウィンドウに属します。
次に、MSスクリプトホストWScript.Shell
とそのexec
/run
メソッドを使用してみました。
<?php
$startDir = "C:/Torque/My Projects/Grim/game";
$runExe = "$startDir/Grimwood.exe";
$envars = " -dedicated -mission \"core/levels/Empty Terrain.mis\"";
$runPath = $runExe . $envars;
chdir($startDir);
try
{
$WshShell = new COM("WScript.Shell");
// gets right process ID
// but process doesn't start properly with params
$oExec = $WshShell->exec($runPath);
echo("PID: " . $oExec->ProcessId);
sleep(4);
// executes properly
// but doesn't return PID
$oExec = $WshShell->run($runPath);
echo("PID: " . $oExec->ProcessId);
}
catch (Exception $e)
{
// never gets hit
echo("Failed to execute");
}
?>
execコマンドを実行すると、正しいPIDが得られますが、プログラムが正しく起動しません(空白のターミナルウィンドウが表示され、何も実行されません)。
runコマンドを実行すると、プログラムが正しく起動します(ターミナルウィンドウに表示されるはずのすべてのテキストが表示されます)が、コマンドはPIDを返しません。
この件に関するご協力をいただければ幸いです。WScript.Shell->exec
コマンドが正しく実行されないようにするために、コマンドで何が間違っているのかわからないので、その問題に関するすべての助けをいただければ幸いです。
可能であれば、proc_open
サーバーのものを* nixに移動したい場合は、もう少しクロスプラットフォームであるため、このメソッドを使用したいと思います。
お時間をいただきありがとうございます。明るい心が私を正しい方向に向けてくれることを願っています。
PHPバージョン:5.4.3
開発マシン:SP1を搭載したWindows 7 Ultimate
サーバーマシン:Windows Server 2008 R2