web-dev-qa-db-ja.com

PHP exec()as background process(Windows Wampserver Environment)

私は、バックグラウンドプロセスを開始する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);
_
25
Emmanuel

次のコマンドで問題が解決しました:

$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);
26
Emmanuel

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つのリンクは、これに関するいくつかの調査を行うのに大いに役立ちました。

9
Rohit

マニュアルから: http://www.php.net/manual/en/function.exec.php

注意:

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

そして私が答えた同様の質問: 別のスクリプトを呼び出すPHPスクリプトを実行し、他のスクリプトが完了する前に制御をユーザーに戻す

4
JohnP

実装方法を変更する必要がある場合があります。そのような長い間待たなければならないことは、アプリのユーザーにとって不快であり、アプリ全体にとって致命的です。

このようなタスクの場合、通常は理想的にはデータベースでタスクをキューに入れ、定期的に処理する方が適切です。 Linuxベースのシステムには同期ジョブがあります。 Windowsでは、スケジューラを使用してbackgroundProcess.phpを起動できます。

3
Shamim Hafiz

Windows環境でexec()を使用する場合、リダイレクトはNUL:/dev/nullは* nix nullファイルです。

1
John

上記のRohitの回答に加えて、Windows 10で動作するように彼のソリューションを編集しましたPHP 7.0.3:

pclose(popen("start /B ". $cmd, "w"));
1
William N Irwin