共有サーバでPHPマルチ環境

.htaccessphp.iniのオーバーライド

このエントリは2007/02/03の再掲です

PHPは、その適用されている範囲の広さにもかかわらず、JavaEEサーブレット仕様のように、アプリケーションコンテキストという環境設定単位を持ちません。そのため、ひとつのWebサーバで動作する複数のアプリケーションが、それぞれ異なる環境設定(php.ini)を必要とする場合に問題が起こります。

たとえば、特定のアプリケーションだけ、サーバセッションキャッシュの保存先を分けたい場合、アウトプットをストリーム化するために出力バッファリングをしたくない場合、利用するライブラリのインクルード検索パスを変更したい場合、などがあるでしょう。場合によっては、あの忌まわしい magic_quotes_gpcをオフにし忘れてあったり、mbstring.internal_encodingを誤ってSJISにしてあったりするかもしれません。(シフトJISはISO 8859互換のコードではないため、1バイト文字文化から生まれた言語に使えないことは有名ですが、実際はそれを知らないサーバエンジニアも多いようです)

そんなときのために、PHPにはphp.ini以外からの環境設定オーバーライド方法があります。Apacheの場合、php.iniの一部の設定を、httpd.confでも記述できます。以下の例のように、php.iniとは少し書き方が異なりますが、設定名と値の名称は共通しています。この例では、PHP4モジュールが稼動している場合のみ、その入出力時の自動的な文字列変換をすべて拒否し、ソースコードなどの内部処理のデフォルト値を UTF-8にしています。

php_value default_charset null
php_flag magic_quotes_gpc off
php_flag output_buffering off
php_value output_handler null
php_value mbstring.language Japanese
php_value mbstring.internal_encoding UTF-8
php_flag mbstring.encoding_translation off
php_value mbstring.substitute_character none
php_value mbstring.func_overload 0

ここで重要なポイントは、もしhttpd.confがPHPアプリケーションを配置するディレクトリの設定オーバーライドを許可していれば、上記の記述が.htaccessに書けるということです。アプリケーションの配備先が共有サーバであったとしても、ディレクトリにAllowOverride Allをしてもらえさえすれば、php.iniに手を入れなくても望みの実行環境設定が手に入るというわけです。

すこし注意点として、WindowsのPHPバイナリのバージョン4以下は、Unix系のものとモジュール識別子が異なることを知っておきましょう。PHPモジュールが組み込まれているかどうかを判別するために、... というディレクティブで設定を囲むと、WindowsのPHP4モジュールは、mod_php4.cという名前で検出されず、 で囲まれた設定が無視されます。Unix系ではPHPバージョンが4の場合を検出し4独自の設定をオーバーライドできますし、WindowsでもPHP5 以上なら、mod_php5.cという名前で検出されました。(Windows版PHP4のモジュール識別名って何なの?) WindowsのApacheでPHP4のアプリケーションを実行する場合、.htaccessPHP設定オーバーライドがで囲まれていないことを確認しましょう。