web-dev-qa-db-ja.com

結果を待たないphp execコマンド(または同様のコマンド)

実行したいコマンドはありますが、PHPに座って結果を待つことは望ましくありません。

<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>

PHP結果を待たないでください。つまり、キックオフして次のコマンドに進みます。

私は何も見つけることができず、その可能性さえ確信できません。私が見つけた最高のものは、CRONの仕事をしてすぐに始められる人でした。

65
greg

ドキュメント から:

コマンドを実行するには、実行中にphpスクリプトがハングしないようにします。実行するプログラムは、phpに出力してはいけません。これを行うには、stdoutとstderrの両方を/ dev/nullにリダイレクトし、バックグラウンドにします。

> _/dev/null 2>&1 &_

コマンドを実行し、実行を続けるためにApacheスレッドに依存しない別のプロセスとして生成するには(誰かがページをキャンセルしても死ぬことはありません)、これを実行します:

exec('bash -c "exec Nohup setsid your_command > /dev/null 2>&1 &"');

108
Cristian

コマンドの最後に&を追加することにより、コマンドをバックグラウンドで実行できます。

exec('run_baby_run &');

ただし、これを単独で行うと、スクリプトがハングします。

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

したがって、後で表示する場合はコマンドの標準出力をファイルにリダイレクトし、それを破棄する場合は/dev/nullにリダイレクトできます。

exec('run_baby_run > /dev/null &');
47
codaddict

これはwgetを使用して、待機せずにURLを通知します。

$command = 'wget -qO- http://test.com/data=data';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

これは、lsを使用して待機せずにログを更新します。

$command = 'ls -la > content.log';
exec('Nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
7
Paul T

「exec Nohup setsid your_command」

Nohupを使用すると、起動したプロセスが最初に終了する場合でもyour_commandを続行できます。存在する場合、SIGNUPシグナルがyour_commandに送信されて終了します(そのシグナルをキャッチして無視しない限り)。

0
jobeard

それを実装するには2つの方法があります。最も簡単な方法は、dev/nullへの直接結果です

exec("run_baby_run > /dev/null 2>&1 &");

ただし、実行する他の操作がある場合は、 ignore_user_abort を検討してください。この場合、接続を閉じた後でもスクリプトは実行されます。

0