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を呼び出すベースクラスに仕込んで、
ループ一回ごとにメソッド呼び出し、変数を解放してあげるのがよいかと。
※後ほどこれらの変数を使わない前提