(php.iniと.user.ini)PHPにはphp.iniと.user.iniの2種類の設定ファイルがある。今まで曖昧な情報でその場しのぎの対応ばかりしていて,正確な知識が身についていなかった。公式マニュアルをなぞりながら,これらの設定ファイルについて整理したのでここに記す。結論php.iniphp.iniはPHPの起動時に一度だけ読み込まれる。サーバーモジュール版だとWebサーバーの起動時に一度だけ読み込まれ,CGI版とCLI版だとスクリプトの呼び出しごとに読み込まれる。php.iniは以下の場所を順番に探し,最初に見つかったphp.iniのみを読み込む。存在する場合,php.iniの代わりに使用される。SAPI名はphp_sapi_name関数で決まる。php.iniの他に追加で.iniファイルを読み込む場合,コンパイル時の--with-config-file-scan-dirで追加の読み込みディレクトリーを指定する。5.2.0以降でこのコンパイル時オプションをPHP_INI_SCAN_DIRで上書きできる。指定された全ディレクトリーで,ファイル名が.iniで終わる全ファイルをアルファベット順に読み込む。読み込まれたファイルの一覧と順序の表示には,php_ini_scanned_files関数を使うか,--iniオプション付きでPHPを実行する。設定ファイルの指定方法ここまでで記した通り,PHPの設定ファイルの指定方法がいくつかある。使いやすいのは,PHPRC環境変数とPHP_INI_SCAN_DIR環境変数を使う方法だろう。指定して,そこに自分用のphp.iniを格納する使い方がよいと感じた。システム標準のphp.ini自体を使いたくない場合があるので,そのときにPHPRC環境変数で標準のphp.iniを上書きすればよいだろう。SAPIの場合にのみ適用される。Serverを使う場合,.htaccessを使えばCGI/FastCGI以外でも.user.iniと同じことができる。メインのphp.iniに加えて,各ディレクトリーの.user.iniをスキャンする。.user.ini形式のINIファイルが対応するのは,モードがPHP_INIPERDIRとPHP_INI_USERの項目だ。.htaccessが使える場合は,こちらで設定すればいいので,.user.iniを使う必要はないだろう。Server以外のサーバーを使う場合や,レンタルサーバーなどでCGI/FastCGI使用時に.user.iniを使う感じだろう。INIファイルINIファイルは共通の形式である程度文法が決まっている。言語ごとの独自の拡張があるのでで注意する。.iniファイルでのコメントは;で行う。/*...*/は使えないことに注意する。php.iniや.user.ini内で環境変数を使う場合,変数を${...}で囲む。シェルの変数と似ている。必須なことに注意する。5.1.0以降では,環境変数だけでなく,既存のini変数も${...}で参照できる。noneのいずれかで指定する。バックスラッシュのエスケープは存在せず,バックスラッシュは単なる文字とみなされる。角括弧([section])でセクションを開始できる。5.3.0から設定の有効範囲を限定する2種類のセクションが使用可能となっている。指定した<host>上でのみ有効。指定した<path>で実行したスクリプトでのみ有効。これらのセクションはCGI/FastCGIでのみ使用される。セクション内でextensionとzend_extension指令は使用できない。[PATH=]セクションに関しては,.user.iniや.htaccessでも,同じようなことができるので使うことはないだろう。".;c:\php\lib"なお,サンプルのphp.iniであるphp.ini-developmentとphp.ini-productionなどでは,[PHP]セクションが書かれている。セクションの処理はソースコード上では,main/php_ini.cでセクションを処理している。PATHとHOST以外は検知していないので,[PHP]は無視されている。そのため,[PHP]セクションの1行は無視されているので,記載する必要はないと思う。PHPのINIファイルのセクションの説明のコメントで,PATHとHOSTのセクションで設定できないextensionとzend_extensionが,分割読み込みのために設定できない問題があり,その対応に[PHP]セクションを指定すればいいとあった。真偽は定かではないが,情報として記載しておく。