20

次のコマンドを使用してバックグラウンドでファイルを処理しようとしていますが、何も実行されません。

exec("php csv.php $file $user > /dev/null &", $output);

削除する> /dev/null &と、ファイルは処理されますが、バックグラウンドでは処理されません。

exec("php csv.php $file $user", $output);

何か案は?

4

3 に答える 3

43

ノート:

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

http://php.net/manual/en/function.exec.php

それで:

exec("php csv.php $file $user > /dev/null &"); // no $output
于 2013-01-28T05:38:58.190 に答える
0

スクリーンの使用を検討しましたか?切り離されたプロセスで実行される画面セッションを開始できます。出力は画面セッションに送られます。画面セッションは、実行中に別の端末に再接続できます。

exec("screen -d -m -S my_php_session csv.php $file $user", $output);
于 2015-10-11T00:29:46.270 に答える
0

Emery Kingの回答に加えてexec()、バックグラウンドプロセスを強制終了するには、1回の呼び出しを使用する必要があります。最初は、プロセスをバックグラウンドに置いておけば、プロセスIDを持っていれば、陽気に進んで後で殺すことができるという印象を受けましたが、そうではありませんでした。

例えば:

// Runs the background process for 10 seconds
// and then kills it and allows php to continue
exec('sh -c \'echo $$ > pid; exec long_running_process\' > /dev/null 2>&1 & sleep 10 && kill $(cat pid)');

// Runs the background process but does not allow
// php to continue until the background process finishes.
exec('sh -c \'echo $$ > pid; exec long_running_process\' > /dev/null 2>&1 &');
exec(' sleep 10 && kill $(cat pid)'); // <- does not execute until background process is done (at which point pid is already dead)
  • echo $$ > pidのプロセスIDを。long_running_processという名前のファイルに書き込みますpid

  • > /dev/null 2>&1 &stdoutとstderrをにリダイレクトし、バックグラウンド/dev/nullに配置long_running_processします。

  • sleep 10 && kill $(cat pid)IDがファイルにあるプロセスを強制終了する前に10秒待機しpidます。

于 2021-07-30T04:23:35.473 に答える