7

バックグラウンドでphpからプロセスを開始するための最良の方法、または実際に方法を探しているので、後でスクリプトで強制終了できます。

今、私は使用しています: shell_exec($Command); これの問題は、プログラムが閉じるのを待つことです。

シェルコマンドを実行したときに nohup と同じ効果が得られるものが欲しいです。これにより、プロセスをバックグラウンドで実行できるため、スクリプトの後半でプロセスを閉じることができます。このスクリプトは定期的に実行され、実行中はプログラムを開くことができないため、閉じる必要があります。

バックグラウンドでコマンドを実行するために .bat ファイルを生成することを考えましたが、それでも後でプロセスを強制終了するにはどうすればよいですか?

Linuxで見たコードは次のとおりです。

$PID = shell_exec("nohup $Command > /dev/null & echo $!");
// Later on to kill it
exec("kill -KILL $PID");

編集:プロセスを強制終了する必要がないことがわかりました

4

5 に答える 5

11

shell_exec('start /B "C:\Path\to\program.exe"');

ここ/Bで重要なのはパラメータです。

これを見つけた場所がもう見つからないようです。しかし、これは私にとってはうまくいきます。

于 2012-06-05T14:11:00.823 に答える
5

PHPマニュアルのこの関数は役に立ちますか?

function runAsynchronously($path,$arguments) {
    $WshShell = new COM("WScript.Shell");
    $oShellLink = $WshShell->CreateShortcut("temp.lnk");
    $oShellLink->TargetPath = $path;
    $oShellLink->Arguments = $arguments;
    $oShellLink->WorkingDirectory = dirname($path);
    $oShellLink->WindowStyle = 1;
    $oShellLink->Save();
    $oExec = $WshShell->Run("temp.lnk", 7, false);
    unset($WshShell,$oShellLink,$oExec);
    unlink("temp.lnk");
}
于 2010-01-15T01:30:47.453 に答える
3

PHP 5.2.8 を使用する Windows 2000 サーバーで同じことを達成しようとしました。

解決策はどれもうまくいきませんでした。PHP は応答を待ち続けました。

解決策は次のとおりです。

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit
于 2013-04-12T07:55:02.170 に答える
1

のphpマニュアルからexec

プログラムがこの関数で開始された場合、バックグラウンドで実行を継続するには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまで PHP がハングアップします。

つまり、出力をファイルにパイプすると、php はそれを待ちません:

exec('myprog > output.txt');

メモリから、実行の一時停止も防止するコマンドファミリーの前に (@ を使用するように) 追加できる制御文字があると思いますが、execそれが何であるか思い出せません。

編集見つけた!UNIX では、& を前に付けて実行されるプログラムはバックグラウンドで実行されます。申し訳ありませんが、あまり役に立ちません。

于 2010-01-14T22:15:28.573 に答える
1

私の Windows 10 および Windows Server 2012 マシンでは、pclose/popen 内で確実に機能する唯一の解決策は、次のように powershell の Start-Process コマンドを呼び出すことでした。

pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r'));

または、引数を指定して出力をリダイレクトする場合は、より詳細に:

pclose(popen('powershell.exe "Start-Process foo.bat 
             -ArgumentList \'bar\',\'bat\' 
             -WindowStyle Hidden
             -RedirectStandardOutput \'.\\console.out\' 
             -RedirectStandardError \'.\\console.err\'"','r'));
于 2017-05-26T18:46:38.890 に答える