使っていて偶然見つけた現象。CakePHPのdebug_kitを使用している際、時折 PHP Fatal error: Allowed memory size of xxxxxxxxx bytes exhausted (tried to allocate xxx bytes) in .... のエラーが発生するようになったので調べてみた。
今回の症状
時折というのはある画面を連続でリロードしていたりすると起きていました。
debug_kitを使用していると、TimerのPanelでPeak Memory Useの値が確認できます。その値がページをリロードするたびに増えていって、最終的に128Mを超えてエラーになるという現像でした。
cake_toolbar_cache
app/tmp/cache/にcake_toolbar_cacheというdebug_kitが作成するcacheファイルがあります。実はエラーが出た際にはこのファイルを削除するだけで一旦は解決するのですが、根本的な解決には至りませでした。
Panel History
debug_kitをdefaultのままで使用していると一番左にHistoryというタブが存在しているはずです。このHistoryという機能は、debug_kitの情報をページをリロードしたり遷移した際に過去の結果を一時的に保存してくれており、その情報を参照することが可能です。
その情報を保存しているところがcake_toolbar_cacheになります。
今回の場合、何の情報が多かったかというとsqlのquery_logが非常に多いページを連続でリクエストしてしまい、結果、エラーになってしまうという現象でした。
解決方法
解決方法はいくつかあると思います。例えばphp.iniのmemory_limitはdefaultでは128Mになっているので変更するのも一つの選択肢だと思います。(PHP7はdefaultでmemory_limitが256Mになっていました。)
ですが、今回はこのHistoryを無効化して、エラーを防ぐという方法をとりました。
通常であれば、debug_kitを使用する場合、以下のようにAppController等に記述することが多いと思います。
public $components = array(
'DebugKit.Toolbar',
);
今回はHistoryのみ無効化すべく、以下のように書き換えました。
public $components = array(
'DebugKit.Toolbar' => array(
'panels' => array(
'history' => false,
),
),
);
この様に書くことでHistoryを無効化することができてこのエラーを回避することができました。
CakePHPでdebug_kitを使用している際にページのレンダリング途中でこのエラーが発生する場合、この現象に当てはまることがあるかもしれません。そのときはこの方法をとってみてもいいかもしれないです。