次のコマンドを使用してバックグラウンドでファイルを処理しようとしていますが、何も実行されません。
exec("php csv.php $file $user > /dev/null &", $output);
削除する> /dev/null &
と、ファイルは処理されますが、バックグラウンドでは処理されません。
exec("php csv.php $file $user", $output);
何か案は?
ノート:
プログラムがこの関数で開始された場合、プログラムがバックグラウンドで実行を継続するには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまでPHPがハングします。
http://php.net/manual/en/function.exec.php
それで:
exec("php csv.php $file $user > /dev/null &"); // no $output
スクリーンの使用を検討しましたか?切り離されたプロセスで実行される画面セッションを開始できます。出力は画面セッションに送られます。画面セッションは、実行中に別の端末に再接続できます。
exec("screen -d -m -S my_php_session csv.php $file $user", $output);
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
ます。