Zend_DbでSQLのログを取るようにしていたら、ログのおかげで無限ループが発生した、というお話です。
現象は、
- Zend_Db_Table_SelectでZend_Paginatorによるページネーションを作成
- Zend_Db_Table_Abstractのfetchとかinsertとかで発行されたSQLをZend_Logでログを取る
- このときdebug_backtraceを使ってメソッド呼び出しを取得
- debug_backtraceの中からクラス名、関数名をZend_Logで出力
- このとき、なぜかZend_Paginatorの__toStringが呼ばれる
- __toStringはrender→getPagesと呼ぶ
- getPagesでページを取得するためにgetItemを呼ぶ
- アダプタがDbなのでクエリを発行
- Zend_Db_Table_Abstractのfetchが呼ばれる
- これのSQLをログを取る
- 1.に戻る
として発生しました。つまりはマジックメソッド__toStringがページネーションを描画する→Dbにクエリ→クエリのログを取る→ログの中でオブジェクトを文字列にするために__toStringが呼ばれる→Zend_Paginatorインスタンスの__toStringも呼ばれる→のループ。