PHPの設定ファイル (php.ini.user.ini)

PHPにはphp.iniと.user.iniの2種類の設定ファイルがある。今まで曖昧な情報でその場しのぎの対応ばかりしていて,正確な知識が身についていなかった。

公式マニュアルをなぞりながら,これらの設定ファイルについて整理したのでここに記す。

php.ini

php.iniはPHPの起動時に一度だけ読み込まれる。つまり,サーバーモジュール版だとWebサーバーの起動時に一度だけ読み込まれ,CGI版とCLI版だとスクリプトの呼び出しごとに読み込まれる。

php.iniは以下の場所を順番に探し,最初に見つかったphp.iniのみを読み込む。

  1. SAPIモジュール特有の場所 (Apache 2のPHPIniDir指令,CGI/CLI版の-cオプション,NSAPIのphp_iniパラメーター,THTTPDのPHP_INI_PATH環境変数)
  2. PHPRC環境変数
  3. Windows用のレジストリキー
  4. 現在の作業ディレクトリー (CLI版を除く)
  5. Webサーバーのディレクトリー (SAPIモジュールの場合),またはPHPディレクトリー (Windowsの場合)
  6. Windowsディレクトリー (C:\windowsまたはC:\winnt),またはコンパイル時の--with-config-file-path

php-<SAPI>.ini (例: php-cli.iniやphp-apache.ini) が存在する場合,php.iniの代わりに使用される。SAPI名はphp_sapi_name関数で決まる。

php.iniの他に追加で.iniファイルを読み込む場合,コンパイル時の--with-config-file-scan-dirで追加の読み込みディレクトリーを指定する。その他,PHP 5.2.0以降でこのコンパイル時オプションをPHP_INI_SCAN_DIRで上書きできる。複数のパスはOSごとのパス区切り文字 (Windows: ;, Windows以外: :) を指定する。

指定された全ディレクトリーで,ファイル名が.iniで終わる全ファイルをアルファベット順に読み込む。

読み込まれたファイルの一覧と順序の表示には,php_ini_scanned_files関数を使うか,--iniオプション付きでPHPを実行する。

設定ファイルの指定方法

ここまでで記した通り,PHPの設定ファイルの指定方法がいくつかある。使いやすいのは,PHPRC環境変数とPHP_INI_SCAN_DIR環境変数を使う方法だろう。

個人的には,基本的にはphp.iniはシステムやビルド時の既定のままにしておき,PHP_INI_SCAN_DIR環境変数で追加のディレクトリー (例: $HOME/.local/etc) を指定して,そこに自分用のphp.iniを格納する使い方がよいと感じた。

たまに,システム標準のphp.ini自体を使いたくない場合があるので,そのときにPHPRC環境変数で標準のphp.iniを上書きすればよいだろう。

.user.ini

.user.iniはPHP 5.3.0以降でディレクトリー単位のINIファイルとして,CGI/FastCGI SAPIの場合にのみ適用される。Apache HTTP Serverを使う場合,.htaccessを使えばCGI/FastCGI以外でも.user.iniと同じことができる。

メインのphp.iniに加えて,各ディレクトリーの.user.iniをスキャンする。現在のドキュメントルート ($_SERVER['DOCUMENT_ROOT']) まで順にたどる。

.user.ini形式のINIファイルが対応するのは,モードがPHP_INIPERDIRPHP_INI_USERの項目だ。

.htaccessが使える場合は,こちらで設定すればいいので,.user.iniを使う必要はないだろう。Apache HTTP Server以外のサーバーを使う場合や,レンタルサーバーなどでCGI/FastCGI使用時に.user.iniを使う感じだろう。

INIファイル

INIファイルは共通の形式である程度文法が決まっている。しかし,言語ごとの独自の拡張があるのでで注意する。

.iniファイルでのコメントは;で行う。PHP本体と異なり,#, //, /*...*/は使えないことに注意する。

php.iniや.user.ini内で環境変数を使う場合,変数を${...}で囲む。シェルの変数と似ている。波括弧 ({}) が必須なことに注意する。PHP 5.1.0以降では,環境変数だけでなく,既存のini変数も${...}で参照できる。

論理値は真はtrue, on, yes,偽はfalse, off, no, noneのいずれかで指定する。

バックスラッシュのエスケープは存在せず,バックスラッシュは単なる文字とみなされる。

角括弧([section])でセクションを開始できる。PHPのiniファイルでは,PHP 5.3.0から設定の有効範囲を限定する2種類のセクションが使用可能となっている。

php.iniのセクション
セクション 説明
[HOST=<host>] 指定した<host>上でのみ有効。
[PATH=<path>] 指定した<path>で実行したスクリプトでのみ有効。

これらのセクションはCGI/FastCGIでのみ使用される。また,セクション内でextensionとzend_extension指令は使用できない。

[PATH=]セクションに関しては,.user.iniや.htaccessでも,同じようなことができるので使うことはないだろう。

php.iniの例
; 引用符をつけないセミコロン(;)の後のテキストは、すべて無視されます
[php] ; セクションマーカ (角括弧の中のテキスト) は無視されます
; 論理値は、次のいずれかで指定します
;    true, on, yes
; または false, off, no, none
register_globals = off
magic_quotes_gpc = yes

; 文字列を二重引用符で括ることも可能です
include_path = ".:/usr/local/lib/php"

; バックスラッシュは他の文字と同様に処理されます
include_path = ".;c:\php\lib"

なお,サンプルのphp.iniであるphp.ini-developmentphp.ini-productionなどでは,[PHP]セクションが書かれている。セクションの処理はソースコード上では,main/php_ini.cでセクションを処理している。しかし,PATHHOST以外は検知していないので,[PHP]は無視されている。

そのため,[PHP]セクションの1行は無視されているので,記載する必要はないと思う。

PHPのINIファイルのセクションの説明のコメントで,PATHHOSTのセクションで設定できないextensionとzend_extensionが,分割読み込みのために設定できない問題があり,その対応に[PHP]セクションを指定すればいいとあった。真偽は定かではないが,情報として記載しておく。

設定のモード

PHPの設定には変更可能なタイミング (モード) が決まっている。

PHP_INI_*モードの定義
モード 説明
PHP_INI_ALL どこでも設定可能。
PHP_INI_PERDIR php.ini, .htaccess, httpd.conf, .user.ini (PHP 5.3.0以降) で設定可能。
PHP_INI_USER ini_set関数,Windowsレジストリー,.user.ini (PHP 5.3.0以降) で設定可能
PHP_INI_SYSTEM php.ini, .httpd.confで設定可能。

レンタルサーバーでphp.iniを直接変更できない場合があるので,PHP_INI_SYSTEMのモードの設定には注意したほうがいいだろう。

設定の変更方法

php.iniと.user.ini以外のPHPの設定の変更には3種類の方法がある。

  1. set_ini関数
  2. Windowsレジストリー
  3. Apache HTTP Serverの設定

1番目のset_ini関数で,スクリプトの実行時に一部のオプションの設定を変更できる。phpinfo関数でオプション全体のリストを取得でき,ini_get関数やget_cfg_var関数で個々のオプションの設定値にアクセスできる。

2番目のWindowsレジストリーによるものは,Windowsでしか使えず,汎用性がないので,関わる必要はないだろう。

3番目のPHPをApache HTTP Serverのモジュールとして使用する場合,Apacheの設定ファイル (httpd.conf)と.htaccessファイルに以下の表に示す指令を記入することで,PHPの設定を変更できる。

なお,このようにして.htaccessで設定を変更する場合,AllowOverride Options権限が必要となる。

Apacheの設定ファイルでのPHPの設定の指令
指令 説明
php_value <name> <value> 指定した設定に値を設定する。モードがPHP_INI_ALLPHP_INI_PERDIRの設定にのみ使用可能。値の削除には<value>noneを指定する。
論理値を設定する場合,php_valueではなく,php_flagで設定する。
php_flag <name> on|off 指定した設定に論理値を設定する。モードがPHP_INI_ALLPHP_INI_PERDIRの設定にのみ使用可能。
php_admin_value <name> <value> 指定した設定に値を設定する。.htaccessでは使用できず,.htaccessやini_set関数で上書きできない。値の削除には<value>noneを指定する。
php_admin_flag <name> on|off 指定した設定に論理値を設定する。.htaccessでは使用できず,.htaccessやini_set関数で上書きできない。
Apache設定の例
<IfModule mod_php5.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>
<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>

PHP定数はPHP (php.iniや.user.ini) 以外では使用できない。そのため,httpd.conf内でerror_reportingオプションの設定に,E_ALLE_NOTICEなどは使用できない。代わりに対応するリテラル値を指定する。

レンタルサーバーなどで,PHPの設定をカスタマイズしたい場合,3番目のApache HTTP Serverで.htaccess内で設定を変更することになるのでphp_valuephp_flagは覚えておくと良いだろう。

コア指令

php.iniで使用可能な指令はモジュールごとに異なる。コア機能の指令は公式マニュアルに記載されている。

数がそれなりにあるので,必要なタイミングで検討すればよいだろう。

結論

PHPの設定ファイルについて整理した。今までなんとなくでやってきていたところがはっきりわかった。例えば,Apacheでの設定やINIファイルの文法だ。

特に,PHP_SCAN_INI_DIR環境変数を知れたのはよかった。今まで存在を知らず,PHPのビルド時のオプションでわざわざ指定していた。

PHPは長く使えるWebの言語なので,今後も一つ一つ正確な知識を積み重ねていきたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です