CLI 専用 config-file-scan-dir

PHPプロ! Tips ML の「PHPの設定ファイルを分離する」記事に触発されて、僕の場合はどうしているか紹介します。
まず PHP の設定ファイルが読み込まれる順番について。
PHP_5_2 ブランチの main/php_ini.c によると、大まかには以下のようになっています。

  1. CLI の -n オプションのように、php.ini を読み込まないフラグが立っていれば、設定ファイルを探索しない。
  2. 環境変数 PHPRC が指定されていれば、それを php.ini の代わりに読み込む。
  3. 環境変数 PHPRC が空なら、configure のオプション --with-config-file-path*1 が指定されていればそれを、そうでなければ %php-install-prefix%/lib を探索パスとする。
  4. カレントディレクトリや PHP 実行バイナリのあるディレクトリ等を探索パスに追加する。
  5. 探索パスの中から最初に見つかった php-%sapi-module-name%.ini を読み込む。%sapi-module-name%cli, cgi, cgi-fcgi, apache2handler 等、PHP_SAPI 定数で確認できる文字列。
  6. php-%sapi-module-name%.ini が存在しなければ、同じ探索パスから php.ini を読み込む。
  7. 上記設定ファイルの有無にかかわらず、configure のオプション --with-config-file-scan-dir が指定されていれば、そこにある拡張子 .ini のファイルすべてを PHP の設定ファイルとみなし、読み込む。

僕の場合は PHP の配布ファイルに含まれる php.ini-recommended を /usr/local/etc/php.ini にコピーし、ひととおりの設定をしてから、それを元に /usr/local/etc/php-cli.ini を作っていました。また、DSO としてインストールした拡張モジュールの設定は FreeBSD Ports を真似て /usr/local/etc/php/extensions.ini に記述していました。
しかしこのままでは Web では使うけど、コマンドラインでは使わない、またはその逆の設定は /usr/local/etc/php(-cli).ini に書かなければいけません。
それの何が問題かというと基本的に何も問題はありません。ただ設定/変更したい値が設定ファイルを開いて一発で見える位置に無いのが嫌なだけです。
しかしながら、できれば頻繁に変更し、かつ全 SAPI で共通でないディレクティブの編集を楽に行いたいものです。そこで下記のような CLI の config-file-scan-dir だけ特別扱いする方法を考えました。

*1:Windows ではセミコロン区切り、その他ではコロン区切りの探索パス

続きを読む