LoginSignup
12
13

More than 5 years have passed since last update.

CodeIgniterが食っていたメモリ

Posted at

CodeIgniterでプログラムを書いていたところ、バッチ処理のところでメモリ不足となって来ました。それ自体は別に驚くべきことでもないのですが、扱うデータ量を考えれば充分すぎる、1GBという多量のメモリを割り当てても解決する兆しがなく、さすがに「これはおかしい」と調べてみることにしました。

CodeIgniter標準のプロファイリング

CodeIgniterでは、

controller
$this->output->enable_profiler();

のように書くことで、標準のプロファイル機能を呼び出すことができます。これには処理にかかった時間やリクエストの詳細、さらには実行したSQLクエリなどが記録されています。

で、このプロファイラの指定は出力ハンドラに対して行うのですが、設定前も含めてクエリの情報がバッチリ取れてしまいます。

クエリの記録

そんなふうに取得できるようにしようとすれば、プロファイラの動作に関係なく記録を取っておく以外に手段はありません。当然ながら、バッチ処理だろうと容赦なく記録は続くので、大量のクエリを発行すればメモリは食いつぶされてしまいます。

これは、DBクラスのsave_queriesという変数が管理している機能ですが、止める方法は2通りあります。1つは、問題になる箇所だけ$this -> db -> save_queries = FALSE;して一時的に止める方法、もう1つは、設定ファイルで

application/config/database.php
$db['database_name']['save_queries'] = FALSE;

のように書いておく方法です。とりわけ、本番環境でこれらの情報を記録して有益となるケースは珍しいでしょうから、設定ファイル単位で止めてしまって問題ないでしょう。

まとめ

フレームワークには多様な機能がありますが、時にはそれがトラブルの原因となります。ブラックボックスにせず、どんな動作をしているかコードを追いかけていくことは、間違いなく有益になります。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13