結論からいうと、セッションに入れたZend_Dateオブジェクトを引数にZend_Date()のコンストラクタを呼ぶとSegmentation faultが起きるっぽい。そんなことをする必要があるかどうかは別にして。
ある日、画面をポチポチっと遷移してたら画面が真っ白になった。
アプリログもapacheログもでてなくて、困ったなーと思ったらバーチャルホストで指定しているログじゃなくて、おおもとの/usr/local/apache/logs/error.logに
[notice] child pid 6191 exit signal Segmentation fault (11)
っていうのがたくさんでてた。
ある日、画面をポチポチっと遷移してたら画面が真っ白になった。
アプリログもapacheログもでてなくて、困ったなーと思ったらバーチャルホストで指定しているログじゃなくて、おおもとの/usr/local/apache/logs/error.logに
[notice] child pid 6191 exit signal Segmentation fault (11)
っていうのがたくさんでてた。
エラーがでる原因のコードを探るべく、1行1行確認していき、とうとう問題の一行をつきとめた。
$new->birthday = new Zend_Date($r['birthday']);$rはセッションの中身。
なぜこのコードがダメなのかわからなくて、gdbつかってデバッグしたりしたけど、結局どうしていいかわからなかった。
で、いろいろ見ていくうちに、セッションファイルの中身を見てたら
:"birthday";O:9:"Zend_Date":8:{s:18:"^@Zend_Date^@_locale";s:2:"ja";s:22:"^@Zend_Date^@_fractional";i:0;s:21:"^@Zend_Date^@_precision";i:3;s:36:"^@Zend_Date_DateObject^@_unixTimestamp";s:10:"1234807235";s:31:"^@Zend_Date_DateObject^@_timezone";s:10:"Asia/Tokyo";s:29:"^@Zend_Date_DateObject^@_offset";i:-32400;s:34:"^@Zend_Date_DateObject^@_syncronised";こんな感じに、birthdayがもともとZend_Dateオブジェクトなことに気づく。Zend_DateのコンストラクタはZend_Dateオブジェクトも取るので、それ自体は問題ないのだけど、なーんか。最後のZend_Date_DateObject^@_syncronisedあたりが気になったのと、そもそもZend_Date()で再生成する必要性もないので、
$new->birthday = new Zend_Date($r['birthday']);を
$new->birthday = $r['birthday'];に変えたら直った。
その後にすごくシンプルに、Zend_Date生成⇒セッションに入れる⇒セッションのZend_Dateオブジェクトを元にZend_Dateを生成という3ステップを書いたら再現した。
ちなみに、わかる範囲だと以下の環境で発生。
PHP 5.2.6、5.2.8 + ZF1.7.2、1.7.4 + CentOS5(Windowsでは起きなかった)
バグ・・・なのかな?
コメントする