読者です 読者をやめる 読者になる 読者になる

chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

ZendのZend_PaginatorとZend_Logで無限ループ

Zend_DbでSQLのログを取るようにしていたら、ログのおかげで無限ループが発生した、というお話です。
現象は、

  1. Zend_Db_Table_SelectでZend_Paginatorによるページネーションを作成
  2. Zend_Db_Table_Abstractのfetchとかinsertとかで発行されたSQLをZend_Logでログを取る
    1. このときdebug_backtraceを使ってメソッド呼び出しを取得
  3. debug_backtraceの中からクラス名、関数名をZend_Logで出力
  4. このとき、なぜかZend_Paginatorの__toStringが呼ばれる
  5. __toStringはrender→getPagesと呼ぶ
    1. getPagesでページを取得するためにgetItemを呼ぶ
    2. アダプタがDbなのでクエリを発行
  6. Zend_Db_Table_Abstractのfetchが呼ばれる
    1. これのSQLをログを取る
    2. 1.に戻る

として発生しました。つまりはマジックメソッド__toStringがページネーションを描画する→Dbにクエリ→クエリのログを取る→ログの中でオブジェクトを文字列にするために__toStringが呼ばれる→Zend_Paginatorインスタンスの__toStringも呼ばれる→のループ。