PHPの設定ファイル (php.ini
と.user.ini
)
PHPにはphp.iniと.user.iniの2種類の設定ファイルがある。今まで曖昧な情報でその場しのぎの対応ばかりしていて,正確な知識が身についていなかった。
公式マニュアルをなぞりながら,これらの設定ファイルについて整理したのでここに記す。
php.ini
php.iniはPHPの起動時に一度だけ読み込まれる。つまり,サーバーモジュール版だとWebサーバーの起動時に一度だけ読み込まれ,CGI版とCLI版だとスクリプトの呼び出しごとに読み込まれる。
php.iniは以下の場所を順番に探し,最初に見つかったphp.iniのみを読み込む。
- SAPIモジュール特有の場所 (Apache 2のPHPIniDir指令,CGI/CLI版の-cオプション,NSAPIのphp_iniパラメーター,THTTPDのPHP_INI_PATH環境変数)
- PHPRC環境変数
- Windows用のレジストリキー
- 現在の作業ディレクトリー (CLI版を除く)
- Webサーバーのディレクトリー (SAPIモジュールの場合),またはPHPディレクトリー (Windowsの場合)
- 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_INIPERDIR
とPHP_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種類のセクションが使用可能となっている。
セクション | 説明 |
---|---|
[HOST=<host>] | 指定した<host> 上でのみ有効。 |
[PATH=<path>] | 指定した<path> で実行したスクリプトでのみ有効。 |
これらのセクションはCGI/FastCGIでのみ使用される。また,セクション内でextensionとzend_extension指令は使用できない。
[PATH=]
セクションに関しては,.user.iniや.htaccessでも,同じようなことができるので使うことはないだろう。
なお,サンプルの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]
セクションを指定すればいいとあった。真偽は定かではないが,情報として記載しておく。
設定のモード
PHPの設定には変更可能なタイミング (モード) が決まっている。
モード | 説明 |
---|---|
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種類の方法がある。
set_ini
関数- Windowsレジストリー
- 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
権限が必要となる。
指令 | 説明 |
---|---|
php_value <name> <value> | 指定した設定に値を設定する。モードがPHP_INI_ALL かPHP_INI_PERDIR の設定にのみ使用可能。値の削除には<value> にnone を指定する。論理値を設定する場合, php_value ではなく,php_flag で設定する。 |
php_flag <name> on|off | 指定した設定に論理値を設定する。モードがPHP_INI_ALL かPHP_INI_PERDIR の設定にのみ使用可能。 |
php_admin_value <name> <value> | 指定した設定に値を設定する。.htaccessでは使用できず,.htaccessやini_set 関数で上書きできない。値の削除には<value> にnone を指定する。 |
php_admin_flag <name> on|off | 指定した設定に論理値を設定する。.htaccessでは使用できず,.htaccessやini_set 関数で上書きできない。 |
PHP定数はPHP (php.iniや.user.ini) 以外では使用できない。そのため,httpd.conf内でerror_reportingオプションの設定に,E_ALL
やE_NOTICE
などは使用できない。代わりに対応するリテラル値を指定する。
レンタルサーバーなどで,PHPの設定をカスタマイズしたい場合,3番目のApache HTTP Serverで.htaccess内で設定を変更することになるのでphp_value
とphp_flag
は覚えておくと良いだろう。
コア指令
php.iniで使用可能な指令はモジュールごとに異なる。コア機能の指令は公式マニュアルに記載されている。
数がそれなりにあるので,必要なタイミングで検討すればよいだろう。
結論
PHPの設定ファイルについて整理した。今までなんとなくでやってきていたところがはっきりわかった。例えば,Apacheでの設定やINIファイルの文法だ。
特に,PHP_SCAN_INI_DIR
環境変数を知れたのはよかった。今まで存在を知らず,PHPのビルド時のオプションでわざわざ指定していた。
PHPは長く使えるWebの言語なので,今後も一つ一つ正確な知識を積み重ねていきたい。
“PHPの設定ファイル (
php.ini
と.user.ini
)” に対して1件のコメントがあります。