[PHP-dev 1426] Re: [PHP-users 33830] .htaccessのmbstring系の設定がディレクトリをまたいで他のphpに反映されてしまう現象について

Moriyoshi Koizumi moriyoshi @ at.wakwak.com
2008年 8月 6日 (水) 16:26:01 JST


Yasuo Ohgaki wrote:
> PHPのini設定の管理は.htaccessやini_set()等で変更しても元の
> 値に戻るよう、PHPがフレームワークとして管理しています。
> # 小泉さんは当然ご存知とは思いますが他の方向け。
>
> この為、PHP_INI_MHとかを設定すれば良いだけになっているのですが、
> 私が知っている限りでも2回ほど、この仕様を知らない方の変更により
> ini設定の取り扱いがおかしくなった事がありました。

補足すると、ini directive の OnUpdate ハンドラは directive が登録された
ときと、値が変更されたときのみ呼ばれるようになっています。

.htaccess や実行時に ini 設定が変更された場合は、どの項目が変更されたか
が EG(modified_init_directives) に記録され、リクエスト処理終了時に元の値
に戻されます (リバート)。このときも OnUpdate ハンドラが呼ばれます。

mbstring の一部の ini directive では PHP の提供する標準の OnUpdate ハン
ドラを使わずに、カスタム OnUpdate ハンドラを経由してモジュールグローバル
を変更しています。

今回のバグは、リバートで元の値が OnUpdate ハンドラに与えられたときに、そ
れが無効な値だった場合は、モジュールグローバルの更新が行われないという挙
動が原因でした (つまり mbstring 側のバグ)。実際には、無効な値が設定され
た場合はモジュールグローバルの初期値に設定しなおさなければなりません。

この間違いが生じたのは、モジュールグローバルのライフサイクルと ini
directives の設定が有効な期間が異なるという点について誤解があったためと
考えられます。

# つまり PHP のアーキテクチャが腐っているのです。

-- 
Moriyoshi Koizumi <moriyoshi @ at.wakwak.com>


PHP-dev メーリングリストの案内