symfony1.2でtaskから実行されたメソッドかWeb側で実行されたメソッドかを判定する小技
こんちは。松田です。今回は久々にphpネタです。
symfonyで開発をしていると、taskから呼び出された場合と、Web側で実行された際に呼び出された場合とで、実行させる処理を切り分けたい場合がたまーに出てきます。
こんなときに処理を切り分けるための小技を紹介したいと思います。
自分が実際にこの切り分けが必要になったのはこんな状況。
・とある登録ページでレコードを作成
・そのレコードを大量に参照する集計ページが必要
・集計ページを開いた瞬間に集計し計算すると、とーーっても重い
・こまった
・集計結果用テーブルを作り、レコードの登録時にmodelのpostSave()で関連する部分だけ集計しておくことに。
・集計ページは集計済みのテーブルを表示するだけなのでめっちゃ軽い!
・解決ッ!
でもここで問題が発生。
上記の処理の追加後に、symfony:build-all-reload を使用してテストデータを読み込んでみると、膨大なテストレコードがsaveされるたびに集計処理を実行してしまい、テストデータのインポートがいつまでたっても終わらないっ! あわわわわ
ここでtaskからの処理とWebからの処理が必要になったというお話でした。
そしてこの処理を切り分ける方法をいろいろ考えていたのですが、最終的に以下のように実装しています。
<?php
// レコードのモデルクラス内
…
public function postSave($event)
{
try {
sfContext::getInstance();
} catch (Exception $e) {
// 例外がcatchされたらtaskからの処理
return;
}
// 例外が出なければWebからの処理
doShuukei();
}
…
これに加えて、まとめて集計をおこなうtaskを一つ作成し、テストデータのインポート後に実行することで今度こそ解決。
もっとシンプルに判定する方法が用意されてるのかもしれませんが、調べてもわからなかったのでこんな怪しげな感じになりました。
まあ、ちゃんと動いてるようだし大丈夫だろう。うん。