別のPHPスクリプトを実行する方法は?
3つのスクリプトが終了するのを待たずに、phpファイルから3つのphpスクリプトを実行したいと思います。つまり、3つのphpファイルは、1つずつ(sequentiell)ではなく、一度に(並列に)実行する必要があります。
3つのスクリプトは、メインのphpファイル(スクリプト)の同じフォルダーにあります。
それらが終了するのを待ちたくない場合は、どちらかで実行してください
exec('php script.php &> /dev/null &');
shell_exec('php script.php &> /dev/null &');
system('php script.php &> /dev/null &');
`php script.php &> /dev/null &`
PHPの構成に応じて、これらのいずれもジョブを実行する必要があります。これらは異なる関数ですが、すべての出力が/ dev / nullにリダイレクトされ、プロセスがすぐに切り離されるため、動作は似ているはずです。
私は、クライアントがbash SMS送信スクリプトを起動する実稼働環境で最初のソリューションを使用します。このスクリプトは、完了するまでに最大10分かかる場合がありますが、失敗することはありません。
詳細情報: http: //php.net/exec・http://php.net/shell_exec・http://php.net/system
使ってみませんかexec("php yourscript.php")
キューイングシステムを使用してphpスクリプト名を保存し、ワーカーを使用してキューからデータをフェッチし、実行を実行することを検討してください(例:beanstalkd )
それらをデタッチジョブとして実行する必要がありますが、それは本当に簡単ではありません。通常の解決策はnohup
、stdoutとstderrを/ dev / null(またはWindowsではNUL)にリダイレクトしてスクリプトを使用または実行することですが、これには多くの場合問題があります。
可能であれば、3つのスクリプトをWebサーバーでスクリプトとして使用できるようにし、非同期cURL関数を介してそれらにアクセスします。これには、ブラウザを介してスクリプトをテストし、スクリプト出力を提供できるという利点もあります。
他の方法には、、popen()
またはLinuxの場合は、at
またはbatch
ユーティリティの使用が含まれます。
http://board.phpbuilder.com/showthread.php?10351142-How-can-I-exec%28%29-in-a-non-blocking-fashionから取得:
コマンドを実行するために、実行中にphpスクリプトがハングしないようにするために、実行するプログラムがphpに出力されないようにする必要があります。これを行うには、stdoutとstderrの両方を/ dev / nullにリダイレクトしてから、バックグラウンドで実行します。
> /dev/null 2>&1 &
コマンドを実行し、apacheスレッドに依存しない別のプロセスとしてコマンドを生成して実行を継続するには(誰かがページをキャンセルしても死ぬことはありません)、次のコマンドを実行します。
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
Windowsの場合http://www.php.net/manual/en/function.exec.php:
function execInBackground($path, $exe, $args = "") {
global $conf;
if (file_exists($path . $exe)) {
chdir($path);
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));
} else {
exec("./" . $exe . " " . escapeshellarg($args) . " > /dev/null &");
}
}
shell_execに「/B」パラメーターを追加します。これにより、複数の実行可能ファイルを一度に実行できます。この質問で私の答えを参照してください:Windowsマシン上のPHP。バックグラウンドでプロセスを開始します
それは同じだ。
shell_exec('start / B "C:\ Path \ to \ program.exe"); ここでは/Bパラメータが重要です。もう一度トピックを見つけようとしましたが、もう見つからないようです。これは私のために働きます。
これで問題が解決することを願っています。