Updated PHP Windows builds for Brotli security fix

設定ファイル

メインの設定ファイル (php.ini) は PHP の起動時に読み込まれます。 PHP のサーバーモジュール版では、Web サーバーの起動時に 一度だけ読み込まれます。CGI 版と CLI 版では、スクリプトが呼び出される度に読み込まれます。

PHP は、メインの設定ファイルを次の手順で探します。

  1. 使用中の SAPI 固有の方法 (たとえば、Apache 2 の PHPIniDir ディレクティブや、 CGI と CLI の -c コマンドラインオプション) で php.ini のパスが指定されている場合は、そのパスを使います。

  2. そうでない場合は、以下の場所から検索パスを組み立てます。

    • PHPRC 環境変数。

    • Windows の場合は、レジストリに設定されたパス (IniFilePath)。

    • 現在の作業ディレクトリ (CLI など、 作業ディレクトリ内を探さない SAPI を除く)。

      注意:

      Apache web サーバーは、スタート時にディレクトリをルート に変更するので、ファイルシステムのルートに php.ini が存在する場合、PHP はそれを読もうとします。

    • PHP の実行ファイルまたは SAPI モジュールがあるディレクトリ。

    • コンパイル時のオプション --with-config-file-path で指定したディレクトリ、または Windows の場合は Windows ディレクトリ (C:\windows もしくは C:\winnt)。

  3. 続いて、その検索パスから php-SAPI.ini を探し、 見つからなければ php.ini を探します。 SAPI 名は php_sapi_name() で調べられます。

メインの設定ファイルを探した後、PHP は追加の .ini ファイルをスキャンすることがあります。 スキャンする場所は、環境変数 PHP_INI_SCAN_DIR で指定されたパスです。この環境変数が設定されていない場合は、 コンパイル時のオプション --with-config-file-scan-dir で指定されたパスです。

Windows レジストリによる場所の指定

Windows では、PHP がメインの設定ファイルの場所を、レジストリの IniFilePath の値から取得することがあります。

どのレジストリキーを調べるかは、PHP のバージョンと、 PHP と Windows がそれぞれ 32bit か 64bit かによって変わります。

32bit OS 上の 32bit ビルドの PHP、 もしくは 64bit OS 上の 64bit ビルドの PHP では、 以下のレジストリキーを順に調べます。

  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP]

キー名の x、y、 z は、それぞれ PHP のメジャーバージョン、 マイナーバージョン、リリース番号を表します。 これらのキーのいずれかに IniFilePath の値があれば、最初に見つかった値を使います。

64bit OS 上の 32bit ビルドの PHP では、 以下のレジストリキーを順に調べます。

  • [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x.y.z]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x.y]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP\x]

  • [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]

これらのキーのいずれかに IniFilePath の値があれば、最初に見つかった値を使います。

設定ファイルの構文

php.ini の中で環境変数を参照するには、次のようにします。 PHP 8.3.0 以降では、参照する変数が未定義の場合にフォールバックする値を 指定できるようになりました。

例1 php.ini での環境変数

; 環境変数 PHP_MEMORY_LIMIT を利用します
memory_limit = ${PHP_MEMORY_LIMIT}
; 環境変数 PHP_MAX_EXECUTION_TIME が未定義の場合、30 にフォールバックします
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}

拡張モジュールに対する php.ini ディレクティブは、 各拡張モジュールのドキュメントで解説されています。 コア ディレクティブ (PHP 本体に対するディレクティブ)のリストは付録にまとめられています。 ただし、(更新の都合上)すべての PHP ディレクティブが 本マニュアル中で解説されている訳ではありません。 使っているバージョンの PHP で指定可能なすべてのディレクティブについては、 php.ini ファイル内に詳細なコメントが記されていますので、参照ください。 もしくは、Git から入手可能な »  最新の php.ini も有用でしょう。

例2 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"

ini ファイル内で既存の ini 変数を参照することが可能です。 例: open_basedir = ${open_basedir} ":/new/dir"

スキャンディレクトリ

PHP の設定で、php.ini を読んだ後に .ini ファイルを探すディレクトリを指定できます。 これは、コンパイル時のオプション --with-config-file-scan-dir で設定します。 このスキャンディレクトリは実行時に上書きできます。 環境変数 PHP_INI_SCAN_DIR で指定します。

複数のディレクトリを指定するには、各プラットフォームのパス区切り文字 (Window や NetWare そして RISC OS の場合は ;、 その他のプラットフォームの場合は :。PHP が用いる値は定数 PATH_SEPARATOR で取得できます) を用います。PHP_INI_SCAN_DIR に空文字列が指定された場合は、 PHP のコンパイル時に --with-config-file-scan-dir で指定されたディレクトリもスキャンします。

指定されたディレクトリの中にあるファイルの中で、ファイル名が .ini で終わるすべてのファイルを、アルファベット順にスキャンします。 読み込まれたファイルの一覧とその順序を調べるには、 php_ini_scanned_files() を呼ぶか、あるいは --ini オプションつきで PHP を実行します。

PHP のコンパイル時に --with-config-file-scan-dir=/etc/php.d
を指定しており、パス区切り文字が : であるものとします

$ php
  PHP は /etc/php.d/*.ini を設定ファイルとして読み込みます。

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP は /usr/local/etc/php.d/*.ini を設定ファイルとして読み込みます。

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP はまず /etc/php.d/*.ini を設定ファイルとして読み込み、
  続いて /usr/local/etc/php.d/*.ini も設定ファイルとして読み込みます。

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP はまず /usr/local/etc/php.d/*.ini を設定ファイルとして読み込み、
  続いて /etc/php.d/*.ini を設定ファイルとして読み込みます。
+add a note

User Contributed Notes 3 notes

up
19
weili
5 years ago
For someone who's also wondering.

PHP can work even if there is no configuration file(php.ini) loaded,
it will simply applies the default values to directives.
up
2
grzegorz129 at gmail dot com
1 year ago
It is worth noting that  $PHP_INI_SCAN_DIR is **not** recursive, which offers flexibility in organizing configuration in base-environment fashion:

$ mkdir -p /tmp/php_conf/prod /tmp/php_conf/dev 
$ touch /tmp/php_conf/php.base.ini /tmp/php_conf/prod/php.ini /tmp/php_conf/dev/php.ini
$ export PHP_INI_SCAN_DIR="/tmp/php_conf:/tmp/php_conf/dev"
$ php --ini
//...
Scan for additional .ini files in: /tmp/php_conf:/tmp/php_conf/dev
Additional .ini files parsed:      /tmp/php_conf/php.base.ini,
/tmp/php_conf/dev/php.ini

Such behavior can be used with docker where whole a subtree of configs is mounted into a dev-container, with ability to control which set of files is loaded using an environment variable.
up
3
Pictor13
2 years ago
Notice that `error_reporting` CANNOT be interpolated with an environment variable (e.g. `error_reporting = ${PHP_ERROR_REPORTING}`).

`error_reporting` is treated differently than other directives:
if assigned an environment variable, this will be silently ignored and replaced with value `0` (aka no-reporting).

I couldn't find documentation about it.
Is maybe an info that should be added in https://github.com/php/php-src/blob/8f5156fcba9906664ecd97e4c279ee980e522121/php.ini-production#L451-L500 ?

I am not aware if this specific behavior affects only `error_reporting` or also other directive.
To Top