PHP の mbstring のバグ
(7/25 に書いたメモを書き直し)
PHP で .htaccess で値を設定した場合,ある条件下では,その設定値が他のディレクトリにまで波及してしまうバグがありました.
(他にも報告がいくつかあったようです)
snapshot では直っているようです.
PHP-dev 1418 で書きましたが
- php.ini では script_encoding は指定しない.
- .htaccess で値が設定されているディレクトリ/パスを訪れた後,.htaccessで値が設定されないディレクトリを訪れたとき
に発症していました.
.htaccess で script_encoding を指定する
OnUpdate_mbstring_script_encoding に飛ぶ.この部分.
static PHP_INI_MH(OnUpdate_mbstring_script_encoding)
ここで .htaccess で設定した値を元に,グローバル変数(Apache プロセス内でグローバル)に値を設定します.
これは
PHP_INI_ENTRY("mbstring.script_encoding", NULL, PHP_INI_ALL, OnUpdate_mbstring_script_encoding)
と宣言(?)しているから.
多分,その後,
PHP_RINIT_FUNCTION(mbstring)
へ.
.htaccess で script_encoding を指定しない or .htaccess がない
(.htaccess がない場合しか見てない)
いきなり,
PHP_RINIT_FUNCTION(mbstring)
へ.
php.ini に設定がない場合,.htaccess で値を設定しているディレクトリに行った後,.htaccess のないディレクトリに行くと,いきなり PHP_RINIT_FUNCTION(mbstring) の処理に飛び,ここでは,グローバル変数の初期化等はありませんので,前に設定された値がそのまま使われてしまう,というものでした.
php.ini に値があった場合は,PHP_RINIT_FUNCTION(mbstring) に来る前にグローバル変数に php.ini の値が入っているので,問題はなかったようです.