PHP 8.3.4 Released!

設定ファイル

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

読み込む php.ini は、これらの場所を順に探します。

  • SAPI モジュール特有の場所 (Apache 2 における PHPIniDir ディレクティブ、 CGI/CLI 版における -c コマンドラインオプション)
  • PHPRC 環境変数。
  • PHP のバージョンごとに別の場所の php.ini を使用することができます。レジストリキーの root は、 インストールされたOS や PHP が 32bit や 64bit どちらのビルドかによって変わります。 32bit OS 上の 32bit ビルドの PHP、 もしくは 64bit OS 上の 64bit ビルドの PHP は [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP] を使いますが、 64bit OS 上での 32bit ビルドのPHPは、 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]] を代わりに使います。 ビルドのbit数がOSと同じPHPのインストールの場合、 以下のレジストリキーを順に調べて使用します。 [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z][HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] および [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]。 x、y および z はそれぞれ PHP のメジャーバージョン、マイナーバージョン、 リリース番号を表します。 64bit OS の 32bitビルドの PHP では、 以下のレジストリキーを順に調べて使用します。 [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] および [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x] x、y および z はそれぞれ PHP のメジャーバージョン、マイナーバージョン、 リリース番号を表します。 これらのキーに IniFilePath の値が設定されていれば、最初に見つかった場所の php.ini を使用します (Windows のみ)。
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] または [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP] にある IniFilePath の値 (Windows のみ)。
  • 現在の作業ディレクトリ (CLI を除く)

  • Web サーバーのディレクトリ (SAPI モジュールの場合)、 もしくは PHP ディレクトリ (そうでない Windows の場合)
  • Windows ディレクトリ (C:\windows もしくは C:\winnt)) (Windows の場合) 、もしくはコンパイル時のオプション --with-config-file-path

php-SAPI.ini (ここで SAPI は使用する SAPI 名。 たとえば php-cli.iniphp-apache.ini) が存在する場合、 php.ini の代わりに使用されます。 SAPI 名は php_sapi_name() によって決定されます。

注意:

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

php.ini の中で環境変数を使うには、次のようにします。

例1 php.ini での環境変数

; 環境変数 PHP_MEMORY_LIMIT を利用します
memory_limit = ${PHP_MEMORY_LIMIT}

拡張モジュールに対する 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 4 notes

up
23
weili
2 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
Pictor13
3 months 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.
up
0
atv dot seth at gmail dot com
3 months ago
For anyone who wants to ignore any directory entirely

On a linux Redhat distro (this was on EL9):

; if using php-fpm, put this file in place"
/etc/systemd/system/php-fpm.service.d/override.conf
[Service]
Environment="PHP_INI_SCAN_DIR="

; do a systemd config reload:
systemctl daemon-reload

; if you want to make sure php on the cli fails if it's not passing 'PHP_INI_SCAN_DIR= php' (this should also affect both linux normal+system users?) then drop this file in place:
cat /etc/php.d/00-dont-use-phpd.ini
auto_prepend_file=MISSING_ENV__PHP_INI_SCAN_DIR__SEE_ETC_PHPD_00_DONT_USE_PHPD_INI
; don't allow php.d directory to load in files
; you must pass 'PHP_INI_SCAN_DIR= ' before your php command on the cli
; reference:
; https://www.php.net/manual/en/configuration.file.php#configuration.file.scan
up
-42
ohcc at 163 dot com
7 years ago
in php.ini you can reference to an existing directive or an environment variable using the syntax ${varname}.

Here are some examples.

sys_temp_dir = "${WINDIR}"

--- ${WINDIR} will be replaced by $_ENV['WINDIR'] at runtime

--- you can set environment variables by Apache and use them in php.ini
--- FcgidInitialEnv AUTHOR "WUXIANCHENG"
--- error_log = "${AUTHOR}.log"

error_log = "${sys_temp_dir}"

--- ${sys_temp_dir} will be replace by the value of sys_temp_dir

Also you can use PHP constants in php.ini, but DONT'T wrap them in ${} or "".

error_log = "/data/"PHP_VERSION"/"

--- it works like this php code:

$error_log = "/data/" . PHP_VERSION . "/";
To Top