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.
設定ファイル (php.ini) は PHP の起動時に読み込まれます。 PHP のサーバーモジュール版では、Web サーバーの起動時に 一度だけ読み込まれます。CGI 版と CLI 版では、スクリプトが呼び出される度に読み込まれます。
読み込む php.ini は、これらの場所を順に探します。
PHPIniDir
ディレクティブ、
CGI/CLI 版における -c
コマンドラインオプション)
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 を除く)
--with-config-file-path
php-SAPI.ini (ここで SAPI は使用する SAPI 名。 たとえば php-cli.ini や php-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 を設定ファイルとして読み込みます。
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.
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.
I'm not sure why the comment saying you can use constants is downvoted so much. This is amazing news and just what I was looking for.
Having a configuration like:
php_admin_value[error_log] = "/logfolder/php-fpm-"PHP_VERSION".$pool.log"
will nicely log to /logfolder/php-fpm-8.3.10.mypool.log , which is really useful if you have multiple versions of PHP running and want to keep your log files separate and not have to fiddle with the configuration each time you update. A list of the pre-defined constants is here ( https://www.php.net/manual/en/reserved.constants.php#reserved.constants.core ) The PHP_*_VERSION, PHP_VERSION, PHP_OS_FAMILY, and maybe PHP_SAPI are useful in this case.
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