PHP on IISで.user.iniがうまく動作しない


IISで仮想ディレクトリを設定してそこでphpを動かすとphpを実行するディレクトリの直下にある .user.ini は読み込むが上位ディレクトリに置いてる .user.ini は読み込んでくれない。
phpのドキュメントによれば .user.ini の動作はこんな感じ。

リクエストされた PHP ファイルがあるディレクトリから始まり、 現在のドキュメントルート ($_SERVER['DOCUMENT_ROOT']) まで順にたどっていきます。
.user.ini ファイル

ここで問題なのは仮想ディレクトリを使うと、リクエストされたphpは必ずしもDOCUMENT_ROOTよりも下層のディレクトリではない事。つまり .user.ini を探しに親ディレクトリに上がっても DOCUMENT_ROOT から外れてるので検索を終了してしまう。
そのため、仮想ディレクトリで .user.ini を使いたい場合、極端な話全てのサブディレクトリに .user.ini を置く必要がある。それかphpを全て同一のディレクトリに並べる。正直どちらもやりたくない。
もうひとつ考えがあって、phpの入口を /VIRTUAL_PATH/index.php の一点に絞り、後は選択された機能に合わせて他のphpをincludeさせる。こっちの方がまだやってもいいかなと思うけど、新規での開発じゃないとやってられない。

この時点で八方ふさがり。もうちょっと調べると $_SERVER["APPL_PHYSICAL_PATH"] なるものに仮想ディレクトリの物理パスが入ってた。「おぉ、これが DOCUMENT_ROOT に代入できればいいんじゃね?」と思ったものの、「これどうやって代入するんだ?」で終了。

もうどうしようもないのかーと諦めかけてた時に php 5.3.0 からセクションという機能がある事を知った。

これらのセクションは、PHP に直接影響を及ぼすわけではありません。 さまざまな php.ini ディレクティブをひとまとめにして、 それを特定のホストや特定のパスにだけ適用する場合に使用します。
php.ini のセクション一覧

これを使えばディレクトリ毎に違うphpの設定を php.ini に書けるみたい。というわけで、php.iniファイルの末尾にこんな感じで早速記述。

[PATH=D:\hoge\fuga] error_reporting = E_ALL & ~E_NOTICE

そしてIISのアプリケーションプールをリサイクル。おぉ~うまく動いてる。

…あれ? .user.ini っていらない子?せっかくIISにも.htaccessみたいな設定ができると喜んだのにこのザマだよorz
いや、仮想ディレクトリ使わなければ充分有効なんだけどね。

作成日:2010/05/29 02:11:42
トラックバック
TrackbackURL:このページのトラックバックの受付は終了しています。

トラックバックはありません。
コメント
※スパムコメントが届くようになったためコメント投稿を中止しました。