« モバイルSuica定期券でブービートラップ | メイン | お留守番 »
2007年04月13日
PHP拡張モジュールブービートラップ |
出陣。105案件 e5/6環境変更。 途中でg案件 PHPデグレード報告を受ける。再現性が高くはないが、ある要求呼でapacheプロセスがSegmentationFault(いわゆるSegFault 11)してしまい、ブラウザ上では「サーバがみつかりません」と表示されてしまう。apacheのエラーログ(error_log)に落ちた時刻とプロセスIDが記録される。PHPのバージョンは4.3.9だった。
いろいろ調査したところPHPの拡張モジュールの一つGDモジュールのImageCreateFromString()関数でABENDすることがわかった。 PHPのconfigureオプションでは、with-gd=/usr/local となっており、PHPソースにバンドルされたGDライブラリを使わずに、自前でインストールしたGDライブラリ(v2.0.32)を参照していた。PHPのGDモジュール内でGDライブラリをCALLしているが、gd_free()関数にてSegFaultしていた。毎回SegFaultするわけではなく、与えるポインタの値によって落ちたり落ちなかったりする。 うーむ謎だ。試しにgd_free関数を呼ばないようにしたら落ちなくなったが、これではメモリリークしてしまう。 ぐぐったらPHPBUGSで同様の症状で悩んでいる異邦人のかたがいて、解決方法も得ることができた。 先頭の次の値にNULLをセットしておくとgd_free()してもSegFaultしなくなるらしい。 半信半疑ながら試してみたところ、ホントに落ちなくなった。 バンドルのGDライブラリがGIF出力に非対応だからこのような構成にしているのだろう。 いやー思った以上に時間がかかり、昼ご飯が遅くなってしまった。
今日から妻がやすらぎ遠征。再び静寂な日々が訪れる。 夕食は久々に吉野家牛丼(並盛380円)を食った。
2008:
投稿者 onsenfan [ Linuxサーバ, トホホ, プログラミング, 独り言 ] : 2007年04月13日 23:38
この記事が役に立った/おもしろいと思ったら、ワンクリックで応援お願いします
トラックバック
このエントリーのトラックバックURL:
http://blog.odorokutamegoro.com/cgi-bin/mt/mt-tb.cgi/1862_0281341641837