# mbstring関係とおぼしき話なんだけど、なぜか日本語の情報が異常に少いのでエントリ書いてみる
最近、もろもろの事情からphp5.2.6を導入後、webサーバの挙動が極端に遅くなることがあることに気づいた。ちょっと負荷が、といった程度ではなく、えんえんと高負荷状態が続き、そうなると大抵のサーバはメールサーバも兼ねているので、そっちが遅延しだす。ヘタするとnamedがコッソリ落ちたりする。ワームが喰いついた形跡もないし、サーバを再起動すると何事もなかったように復帰。
で、いろいろと原因を探ったところ、httpd/error_logにこんな記録が。
[Sun Nov 16 11:47:54 2008] [error] [client xxx.xxx.222.55] PHP Warning: unpack() [function.unpack]: Type V: not enough input, need 4, have 0 in /xxxxxxxxx/wp-includes/gettext.php on line 91
[Sun Nov 16 11:47:54 2008] [error] [client xxx.xxx.222.55] PHP Warning: unpack() [function.unpack]: Type V: not enough input, need 4, have 0 in /xxxxxxxxx/wp-includes/gettext.php on line 91
[Sun Nov 16 11:48:29 2008] [error] [client xxx.xxx.222.55] PHP Fatal error: Maximum execution time of 30 seconds exceeded in /xxxxxxxxx/wp-includes/streams.php on line 92
うーん、わけわからん。とにかく、gettextまわりがよろしくない、ということで、いろいろ調査。
ま、そのものずばりの話ではあるんだけど、結局「WPLANGを空っぽにするとイイよ」という投げ遣りな回答。いや、まあ、それはそうなんだが。。。(ちなみに、コレをやると、一見管理画面の国際化がなされなくなる「だけ」に見えますが、gettextが絡むタイトル表示部分とかの、「外見」部分が若干おかしくなるのでオススメしません)
A PHP mbstring bug? | Jure Merhar
こういう話も。たぶん、コレが正解に近いと思うし、wordpressのgettextクラス(特に2.6xのやつ)はこれでもか、と修正コードが並んでいるんですが、ソレにしても解決せず。とにかく、なんか起きてしまったhttpdのプロセスがめちゃくちゃリソースを喰うので、それらが切り捨てられる(タイムアウトする)までは問題は解決しない模様。
今のところウチでの解消方法は、httpd.confで、
MaxRequestsPerChild 16
※デフォは4000。プロセスの「再起動までの寿命回数」を決めるので、(メモリリークするプログラムを抱えていない、健全なサーバであれば)大きな値を指定するのが推奨。
と超短命にして、「プロセスごとにこまかくapacheを再起動」というコスい戦術。
Firefox2.xだと、管理画面上にエラーが現れて更新自体うまくできなくなったりと、とにかくスッキリしないこの現象、どなたか情報プリーズ。
[2009-01-17追記]解決しました。