FreeBSDでソースからコンパイルしたPHP5ですが、マルチバイトのあたりで期待通りの動作をしません。応急処置はできたのですが、自分の環境が悪いのか、それともPHP自体の不具合なのかわかりません。同じような現象が起きたという情報をどなたかお持ちでしょうか。

環境:
Pentium D 820 + EM64T対応マザーボード
FreeBSD 6.1 amd64
Apache 2.0.63
PHP 5.2.6

コンパイル時の指定:
export CFLAGS="-DHAVE_BROKEN_REALPATH -O3 -march=nocona -mmmx -msse -msse2 -msse3 -mfpmath=sse"
export CXX=gcc
export CXXFLAGS="${CFLAGS}"
./configure \
--prefix=/usr/local/php5 \
--enable-force-cgi-redirect \
--enable-zend-multibyte \
--enable-mbstring \
--enable-mbregex \
--with-zlib \
--enable-zip \
--enable-bcmath \
--enable-calendar \
--enable-ctype \
--enable-exif \
--enable-ftp \
--with-gd \
--with-jpeg-dir=/usr/local \
--with-ttf \
--with-freetype-dir=/usr/local \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-sockets \
--with-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--with-config-file-path=/usr/local/php5/etc


php.iniより抜粋:
output_handler = mb_output_handler
max_execution_time = 10
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.script_encoding = auto
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.strict_encoding = On
mbstring.strict_detection = On


次のようなテストスクリプトを用意します。
<?php
phpinfo();
?>


クエリ無しでブラウザからリクエストすると、phpinfo()の結果が表示されます。

次のような、マルチバイトを含むクエリでリクエストします。
http://.../phpinfo.php?a=はにほへといろは

すると、サーバのCPU使用率が100%近い状態になり、そのままタイムアウトを迎えて500サーバエラーがブラウザに返されます。

php.iniを次のように変更します。
mbstring.http_input = pass


マルチバイトを含むクエリでリクエストすると、今度はphpinfo()の結果が表示されます。当然、$_GETは変換されていません。

テストスクリプトを次のように変更します。
<?php
mb_convert_variables(mb_internal_encoding(), 'auto', $_GET);
phpinfo();
?>


マルチバイトを含むクエリでリクエストすると、サーバのCPU使用率が100%近い状態になり、そのままタイムアウトを迎えて次のようなエラーがブラウザに返されます。
引用
Fatal error: Maximum execution time of 10 seconds exceeded in phpinfo.php on line 2


・この時のHTTP入力の文字エンコーディングはSJIS
・mb_convert_encoding()は問題なく使える
・SJISの文字列が入力され、かつ入力文字エンコーディングを'auto'に指定すると変換先が'SJIS','EUC_JP','UTF-8'のいずれの場合でも、mb_convert_variables()でタイムアウトする
ということがわかっています。

マニュアルにはmb_convert_variables()の変換元文字エンコーディングについて'auto'を指定することは書かれていませんが、
・仮想PCにFreeBSD 6.1 i386とPHP 5.2.4をインストールした環境
・Windows XP Pro sp2にWIN32バイナリ版PHP 5.2.5の環境
では'auto'を指定しても問題なく動いています。

また、仮想PCにFreeBSD i386の環境でソースからコンパイルしたPHP5の環境では、タイムアウトはしませんが、mbstring.http_input = auto等を有効にしても、enctype="multipart/form-data"を含むフォームからのHTTP入力は変換されないままになってしまいます。

詳しくは調べていませんが、コンパイル時の指定でのコンパイラオプションを変えたり、(今回の指定ではCGI動作ですが)PHPをモジュール動作にしたりしても同様でした。PHP5.1.6でも同様な現象が発生していました。

PHP4.4.4を実運用していますが、こちらは期待通りに動作しています。
スクリプト中で文字エンコーディングの変換をすれば回避できる話ですが、PHP4では何も問題なく楽にマルチバイトが扱えていたので、PHP5でうまくいかないのがくやしいところです。