では、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 はpid
SHELL の を返します。詳細については、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
た結果が返されます ( pid
SHELL の を取得します)。
では、バックグラウンド化 + 正しい 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];