私はこれを使用して無限ループのJavaファイルでjavawを実行しています:
$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
2 => array("pipe", "w") // stderr is a file to write to
);
// e.x. $javaCmd = "java -cp "../Fully Diversified Sequences of Sets" SuperEasyProblemSolution2 > /dev/null 2>&1 < h.in"
$proc = proc_open($javaCmd, $descriptorspec, $pipes);//, $cwd, $env);
stream_set_blocking($pipes[0], 0) ;
$status = proc_get_status($proc);
var_dump($status);
$timeOut = 5;
$currentSecond = 0;
while( $currentSecond < $timeOut ) {
echo '<br/>';
sleep(1);
$currentSecond = $currentSecond +1;
if( ! $status["running"] )
{
echo 'process exited before timing out'; // Process must have exited, success!
return;
}
$status = proc_get_status($proc);
var_dump($status);
} // end while
if($currentSecond == $timeOut)
{
// kill KILL KILL!
exec("taskkill /PID ".$status['pid']);
}
への最初の呼び出しでproc_get_status
、running
属性はtrueを返します。への2回目の呼び出し(1秒後)でproc_get_status
、falserunning
を返します。ただし、アプリケーションjavaw.exeはまだ実行中です(whileループを呼び出して、最終的にタイムアウトします)。proc_get_status
私の目標は、タイムアウトの期限が切れた後にプログラムをタスクキルすることです。ここで同様の質問を参照してください。Win7 64ビット、PHP5.3で実行しています
上のVarダンプ$status
:(注;私は適用しようとしましstream_set_blocking($pipes[0], 0) ;
た、同じ問題)
タイムアウトループに入る前:
array(8) {
["command"]=> string(157) "java -cp "../Fully Diversified Sequences of Sets" SuperEasyProblemSolution2 /dev/null 2>&1 < h.in"
["pid"]=> int(3264)
["running"]=> bool(true)
["signaled"]=> bool(false)
["stopped"]=> bool(false)
["exitcode"]=> int(-1)
["termsig"]=> int(0)
["stopsig"]=> int(0)
}
最初の反復/sleep(1)後:
array(8) {
["command"]=> string(157) "java -cp "../Fully Diversified Sequences of Sets" SuperEasyProblemSolution2 /dev/null 2>&1 < h.in"
["pid"]=> int(3264)
["running"]=> bool(false)
["signaled"]=> bool(false)
["stopped"]=> bool(false)
["exitcode"]=> int(1)
["termsig"]=> int(0)
["stopsig"]=> int(0)
}
process exited before timing out
テスト後、$status['pid']はWindowsのリソースモニターでのjavaw.exeのpidとは異なるようです。