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 だけ特別扱いする方法を考えました。
※手順に問題があったので、修正しました。
まずは普通に PHPコンパイル & インストール。

% prefix=/usr/local
% ./configure --prefix="$prefix" --with-config-file-path="$prefix/etc" --with-config-file-scan-dir="$prefix/etc/php" ...
% make
% sudo make install

CGI/FastCGI SAPI の場合は、CGI バイナリをリネーム。

% sudo mv "$prefix/bin/php" "$prefix/bin/php-fcgi"

CLI 関連のバイナリ等を削除し、config-file-scan-dir を書き換え、再コンパイル & CLI のみインストール。
(\ は \ に読み替えてください)

% rm -f main/*.la main/*.a main/*.lo main/*.o sapi/cli/*.la sapi/cli/*.a sapi/cli/*.lo sapi/cli/*.o sapi/cli/php
% sed -i '.bak' 's@"\('"$prefix"'/etc/php\)"@"\1-cli"@' main/build-defs.h
% make
% sudo make install-cli

これで CLI 固有の設定値を /usr/local/etc/php-cli/*.ini に追い出すことが可能になりました。全体の設定を /usr/local/etc/php.ini 一本でできるようになるのも (個人的には) 嬉しいですね。

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