7

では、Windows 上の PHP では、バックグラウンドで実行可能ファイルを実行し、そのPIDを取得することは可能ですか? 両方のタスクを別々に達成することは可能ですが、一緒にすることはできないと推測しました。

プロセスのバックグラウンド化

シェル経由で起動されたプロセスをバックグラウンドにするには、コマンド'start /B "bg" myprog.exe'を使用する必要があり、その直後にシェル プロセスを閉じる必要があります。

これを行うには、多くの人がpclose( popen( ... ) )そのように使用しますが、私の知る限り、 popen を使用するときに をpclose( popen( 'start /B "bg" myprog.exe', 'r') );取得することは不可能です。pid

popen では取得できpidないため、proc_open を参照する必要があります。

PID の取得

を使用すると、true に設定されている場合にのみproc_open、exe の pid を取得できます。 bypass_shell

bypass_shellが false (デフォルト) に設定されている場合、Windows はpidSHELL の を返します。詳細については、https ://bugs.php.net/bug.php?id=41052 を参照してください。

問題の説明

start /Bコマンドが proc_open に渡されると失敗します。bypass_shell = trueこれは、SHELL をスキップし、コマンドライン引数を myprog.exe に直接送信するためです。

逆に、bypass_shell = falseシェルをすぐに閉じるために proc_close を使用した場合 (デフォルト)、myprog.exe はバックグラウンドで実行されますが、使用した場合と同じようにpclose( popen( ... ) )間違っ pidた結果が返されます ( pidSHELL の を取得します)。

では、バックグラウンド化 + 正しい pid 検索は可能ですか?

そうでない場合、次善の策は何ですか? サードパーティの拡張機能をインストールできないように、共有ホスティングにデプロイされる PHP スクリプトに対してこれを行う必要があります。私が思いつく最善のtasklist方法は、バックグラウンドで myprog.exe を起動する前後のスナップショットを取り、結果をクロス分析することです。myprog.exe は同時に実行できることに注意してください。

それが役立つ場合、違いはありませんが、myprog.exe は実際には ffmpeg (ほとんどの共有 Web ホストにインストールされています) です。

一時的な解決策

// background the process
pclose( popen( 'start /B "bg" ffmpeg.exe', 'r') );

// get the pid using tasklist
exec( 'TASKLIST /NH /FO "CSV" /FI "imagename eq ffmpeg.exe" /FI "cputime eq 00:00:00"', $output );
$output = explode( '","', $output[0] );
$pid = $output[1];
4

1 に答える 1

-1

Windowsサーバーでは機能しないため、これはOPの質問に対する正確な回答ではありませんが、exec()が有効になっているLinuxサーバーでは問題なく機能するため、誰かを助けるかもしれません;)

$pidfile = 'myPidFile'; //coule be done better with tempnam(), but for this example will do like that ;)
$outputfile = '/dev/null'; //can be any text file instead of /dev/null. output from executable will be saved there
$cmd = 'sleep 30'; // this would normaly take 30 seconds
exec(sprintf("%s > %s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile));

$pid = file_get_contents($pidfile);
echo $pid;
//delete pid file if you want
//unlink($pidfile);
于 2013-05-08T19:30:22.273 に答える