【コピペで使える】PHPプログラムをバックグラウンドで実行する方法
集計処理やファイルの生成などPHPで重い処理を行う場合、Webブラウザ上の実行(HTTPリクエスト)だとタイムアウト時間の制限にひっかかって処理が途中で終了してしまうことがあります。
ファイル生成をアウトプットとした処理の場合には、必ずしもWebブラウザ上で実行する必要はありませんので、こういった場合にはバックグラウンドでPHPを実行する方法がお勧めです。
例えばWebブラウザ上でボタンを押すと集計プログラムをバックグラウンド上で実行するようにしておけばよいでしょう。
今回はこの方法について紹介をしたいと思います。
PHPのバックグラウンド実行(run.php)
$cmd = 'nohup php sample.php [引数1] [引数2] > /dev/null &';
exec($cmd);
PHPをバックグラウンドで実行する書き方は上記の通りです。これで[引数1]と[引数2]を渡した状態でsample.phpを実行します。(sample.phpは実際に実行するPHPファイル名に書き換えてください。)
Webアプリケーション上で上記を記述しておけばあとの処理はWebサーバーのバックグラウンドで走りますので、ブラウザを閉じても処理は継続します。
ここで引数を受け取る場合は通常の引数$_GETなどでOKです。
PHPプログラムでの引数の受け取り方(sample.php)
echo $argv[1]; // 引数1
echo $argv[2]; // 引数2
バックグラウンド処理用のPHPプログラムに渡された引数は上記のように$argv[*]で受け取ることができます。
LinuxのPHPコマンドで指定された引数を受け取るときにはこのように書くことになります。
Linuxでのプロセスの確認方法
$ ps -ef
Linuxでちゃんとバックグラウンド処理が走っているかどうか確認するには上記コマンドを使います。
Webページ上での実行方法
<a href="#" onclick="runPhp(a, b);return false;">バックグラウンド処理実行</a>
<script><!--
function runPhp(a, b){
alert('処理を実行します。');
SendHttpRequest('a='+a+'&b='+b, 'POST', './run.php', function() {
if(this.responseText){}
}, true);
}
--></script>
Webページ上での実行に関してはAjaxで実行が無駄なページ遷移をしなくて済むためお勧めです。
※上記記述はAjaxのライブラリが必要になりますのであくまで参考として記載しておきます。