Allowed memory size of **** bytes exhausted in /usr/*/pear/DB/
使用メモリがphp.iniの設定値を超えた場合に出る表題エラーですが、
出現箇所が、pear/DBやMDBといったDBライブラリの中で出る場合があります。
このような場合は、DBアクセスしている箇所といった特定しかできず、複雑な処理であれば突き止めるのは困難。
ただ問題としては、使用しているDBインスタンス変数のどれかが膨らんだと思われる。
怪しいのは、クエリを実行するたびに蓄積されていく以下3つ
- $db->prepare_types
- $db->prepare_tokens
- $db->prepared_queries
プリペアドステートメント系のものですね。
大抵、ループ処理の中で、1つのDBインスタンスを使いまわして溜まり過ぎるパターンです。
というわけで、単純に$db->free();を入れて結果セットを解放するだけでは不十分なケースが多く、
<?php function freePrep() { unset($this->db->prepare_types); unset($this->db->prepare_tokens); unset($this->db->prepared_queries); }
みたいなメソッドを、pear::DBを呼び出すベースクラスに仕込んで、
ループ一回ごとにメソッド呼び出し、変数を解放してあげるのがよいかと。
※後ほどこれらの変数を使わない前提