私は、バックグラウンドプロセスを開始するphpトリガーファイルを設定しようとしています。 ( この質問を参照してください )
私はこれをWindows Wampserver環境で実行しています。
したがって、たとえば、_trigger.php
_を解析および実行するように呼び出すexec関数を実行する_backgroundProcess.php
_があります。
ただし、問題は、私の_trigger.php
_ファイルがexec()
コマンドが_backgroundProcess.php
_の実行を完了するのを待ってから停止することです。バックグラウンドプロセスは約20〜30秒間実行され、_trigger.php
_は_backgroundProcess.php
_が完全に終了するまでその間待機しています。
それは理にかなっていますか? exec()
コマンドを実行する_trigger.php
_ファイルは次のとおりです
_exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');
_
基本的に、私は_trigger.php
_がbackgroundProcessをトリガーして、終了するまで待機しないことを望んでいます。
[〜#〜]編集[〜#〜]
次のコマンドで問題が解決しました:
_$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
_
次のコマンドで問題が解決しました:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
Windows 2000サーバーでPHP 5.2.8。
解決策はどれも私にとってはうまくいきませんでした。 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
ps:他のスレッドに同じ返信を投稿する( WindowsマシンではPHP、バックグラウンドでプロセスを開始する )これらの2つのリンクは、これに関するいくつかの調査を行うのに大いに役立ちました。
マニュアルから: http://www.php.net/manual/en/function.exec.php
注意:
この関数を使用してプログラムを起動した場合、プログラムをバックグラウンドで実行し続けるには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、PHP=がプログラムの実行が終了するまでハングします。
そして私が答えた同様の質問: 別のスクリプトを呼び出すPHPスクリプトを実行し、他のスクリプトが完了する前に制御をユーザーに戻す
実装方法を変更する必要がある場合があります。そのような長い間待たなければならないことは、アプリのユーザーにとって不快であり、アプリ全体にとって致命的です。
このようなタスクの場合、通常は理想的にはデータベースでタスクをキューに入れ、定期的に処理する方が適切です。 Linuxベースのシステムには同期ジョブがあります。 Windowsでは、スケジューラを使用してbackgroundProcess.phpを起動できます。
Windows環境でexec()
を使用する場合、リダイレクトはNUL:
。 /dev/null
は* nix nullファイルです。
上記のRohitの回答に加えて、Windows 10で動作するように彼のソリューションを編集しましたPHP 7.0.3:
pclose(popen("start /B ". $cmd, "w"));