共有サーバでPHPマルチ環境
このエントリは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モジュールが組み込まれているかどうかを判別するために、