CodeIgniterでプログラムを書いていたところ、バッチ処理のところでメモリ不足となって来ました。それ自体は別に驚くべきことでもないのですが、扱うデータ量を考えれば充分すぎる、1GBという多量のメモリを割り当てても解決する兆しがなく、さすがに「これはおかしい」と調べてみることにしました。
CodeIgniter標準のプロファイリング
CodeIgniterでは、
$this->output->enable_profiler();
のように書くことで、標準のプロファイル機能を呼び出すことができます。これには処理にかかった時間やリクエストの詳細、さらには実行したSQLクエリなどが記録されています。
で、このプロファイラの指定は出力ハンドラに対して行うのですが、設定前も含めてクエリの情報がバッチリ取れてしまいます。
クエリの記録
そんなふうに取得できるようにしようとすれば、プロファイラの動作に関係なく記録を取っておく以外に手段はありません。当然ながら、バッチ処理だろうと容赦なく記録は続くので、大量のクエリを発行すればメモリは食いつぶされてしまいます。
これは、DBクラスのsave_queries
という変数が管理している機能ですが、止める方法は2通りあります。1つは、問題になる箇所だけ$this -> db -> save_queries = FALSE;
して一時的に止める方法、もう1つは、設定ファイルで
$db['database_name']['save_queries'] = FALSE;
のように書いておく方法です。とりわけ、本番環境でこれらの情報を記録して有益となるケースは珍しいでしょうから、設定ファイル単位で止めてしまって問題ないでしょう。
まとめ
フレームワークには多様な機能がありますが、時にはそれがトラブルの原因となります。ブラックボックスにせず、どんな動作をしているかコードを追いかけていくことは、間違いなく有益になります。