All posts
PHPで重い処理をタイムアウトさせずバックグランドで行わせる方法

とある案件で、DBに巨大なデータの書き込み(300万件越え)や更新を行わせる処理が必要でして、管理画面のボタンをポチッとすれば更新できるようにしたいのですが、あまりにも処理が重いため、タイムアウトして処理が止まってしまい困り果ててしまいました。
そんな訳で、重い処理を別スレッドで走らせて、しかもタイムアウトさせない方法を考えてみましたよっと。
PHPのスクリプトをタイムアウトさせない方法
要は重い処理をさせるプログラムを単独で用意し、そのスクリプトを別スレッドで走らせてやろうという作戦です。
メインのスレッドから、以下のように呼び出してやります。
exec("nohup php xxxx.php > /dev/null &");「xxxx.php」が重い処理を担当するスクリプトです。
ポイントは2つあります。
「nohup」として、メインのスレッドが終了しても呼び出したプログラムを実行し続けるように指定します。
さらに、コマンドの後に「> /dev/null &」を置いて返却値を捨てることで、外部スクリプトの終了を待たずメインのスクリプトを終了させます。
重い処理を受け持つスクリプトには、念のために以下の一行を加えてPHPのタイムアウトを防止し(PHPがセーフモードで実行されている場合は効果なし)、さらに開始を通知するメールと、完了を通知するメールが送信されるようにして、バックグランドで走るスクリプトの状態を把握できるように組んでみました。
set_time_limit(0);あ、共用のレンタルサーバーでこれやると、たぶん叱られると思いますので、自分が管理するサーバーだけでお使いくださいね。




Discussion