2009/12/16

PHP 5.3 の新機能: .htaccess の代わりになる .user.ini

突然ですが、PHP の話です。マイクロソフトの PHP on IIS のサイトでかなり昔に書いた記事 「はじめての PHP」(Windows Server World  2007 年 7、8 月号からの抜き刷り) の PDF が以前からダウンロードできるようになっています。記事の内容は、IIS 6 向けの FastCGI for IIS の最初のリリースをベースとしているため、古い情報が多いので注意が必要ですが、後半のサンプル コードについては PHP 超初心者向けで参考になると思います。

Apache 上の PHP であれば、仮想ディレクトリ内の .htaccess や .php ファイル内で php.ini の設定を上書きすることができます。IIS で PHP を使う場合、これまでは PHP のインストール先にある php.ini の 1 箇所で構成する方法しかありませんでした。上記の記事でもそう書いています。PHP 開発者にとって、これは大きな制約だと思います。うれしいことに、PHP 5.3.0 以降では、IIS (Windows ?) 向けと思われる新機能が追加され、仮想ディレクトリごとに php.ini の設定を上書きする方法が追加されました。

以下は、Windows Server 2008 R2 テクノロジ入門 (日経 BP ソフトプレス) 用に書いたコラムの生原稿です。諸事情 (ページ数など) により丸ごとカットになったものです。



PHP 5.3 の新機能 - .htaccess の代わりになる .user.ini

 PHP の設定は、php.ini で行います。Apache の環境では、.htaccess ファイルを使用して、仮想ディレクトリごとに php.ini の設定を上書きすることができます。IIS で PHP を利用する場合、これまで php.ini の設定を上書きする標準的な方法は存在しなかったため、Web サーバーごとに1つの設定しか利用できませんでした。PHP 5.3.0 以降では、php.ini に新機能が追加され、IIS 環境でサイトや仮想ディレクトリごとに php.ini の設定を上書きできるようになりました。詳しくは、「PHP: INI ファイルの扱いに関する変更」(http://www.php.net/manual/ja/migration53.ini.php)を参照してください。

 php.ini の設定を上書きする方法は2つあります。1つは、.user.ini ファイルを使用する方法です。.user.ini を使用するには、php.ini ファイルに追加された新しいディレクティブ user_ini_.filename と user_ini.cache_ttl を使用します。一例として、アップロード可能なファイルサイズの上限値である upload_max_filesize(既定値は 2MB)の設定値を仮想ディレクトリごとに変更してみましょう。まず、PHP のバイナリをインストールしたフォルダーにある php.ini ファイルを編集して、次の2つのディレクティブを設定します。

--- C:\Program Files(x86)\PHP\php.ini ---
user_ini_.filename = ".user.ini"
user_ini.cache_ttl = 300
-----------------------------------------

 次に、設定を上書きしたい仮想ディレクトリのフォルダー内に .user.ini ファイルを作成し、次のように上書きする設定を行います。

--- C:\Inetpub\wwwroot\demo\.user.ini ---
upload_max_filesize = 4M
-----------------------------------------

 以上で設定は完了です。仮想ディレクトリに次のような PHP ファイルを配置して、Web ブラウザーから参照してみてください。php.ini で設定した値を .user.ini で上書きることを確認できるはずです。なお、以前のバージョンの PHP を記述したことがある人であれば、phpinfo() だけでいいのではと思うかもしれません。新しいバージョンの PHP は、サーバーのタイムゾーンの設定が簡単に参照できることを嫌います。phpinfo() の出力にはタイムゾーンの設定が含まれるため、date_default_timezone_set() の行がないと、セキュリティ上問題があるとして phpinfo() の出力を行いません。

--- phpinfo.php -------------------------
<?php
date_default_timezone_set("Asia/Tokyo");
phpinfo();
?>
-----------------------------------------

php.ini の user_ini.cache_ttl は、PHP エンジンが .user.ini を再読み込みする間です。既定は300秒(5分)ごとに再読み込みが発生します。.user.ini の新しい設定値が反映されるまでにはタイムラグがあることに注意してください。