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.
Die Konfigurationsdatei (php.ini) wird beim Start von PHP eingelesen. Für die Servermodul-Versionen von PHP geschieht dies nur einmal beim Start des Webservers. Für die CGI- und CLI-Versionen geschieht dies bei jedem Aufruf.
Nach der php.ini wird an folgenden Orten in der angegebenen Reihenfolge gesucht:
PHPIniDir
-Direktive
im Apache2, -c
Kommandozeilenparameter in CGI und
CLI)
php.ini
-Datei kann für verschiedene
Versionen von PHP gesetzt werden. Die Wurzel der Registrierungsschlüssel
hängt davon ab, ob es sich um ein 32- oder 64-bit-System handelt, und
ebenfalls von der PHP-Version. Für 32-bit-PHP auf einem 32-bit-System
oder für 64-bit-PHP auf einem 64-bit-System ist
[(HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
zu verwenden; für
32-bit-PHP auf einem 64-bit-System ist stattdessen
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
] zu
verwenden. Bei einer Installation mit derselben Bitanzahl werden die
folgenden Registrierungsschlüssel in der angegebenen Reihenfolge
durchsucht:
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y]
und
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]
, wobei x, y und z
die Major-, Minor- und Release-Versionen von PHP darstellen.
Für 32-bit PHP-Versionen auf einem 64-bit-System werden die folgenden
Registrierungsschlüssel in der angegebenen Reihenfolge durchsucht:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z]
,
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y]
und
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x]
, wobei
x, y und z die Major-, Minor- und Release-Versionen von PHP darstellen.
Falls ein Wert für IniFilePath
in einem dieser
Schlüssel existiert, so wird der zuerst gefundene als Position der
php.ini
verwendet (nur unter Windows).
[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
bzw.
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]
, Wert von
IniFilePath
(nur unter Windows).
--with-config-file-path
-Kompilierungsoption.
Falls die Datei php-SAPI.ini existiert (wobei SAPI die verwendete SAPI ist, was als Dateinamen z. B. php-cli.ini oder php-apache.ini ergibt), wird diese anstelle der php.ini verwendet. Der Name der SAPI kann durch php_sapi_name() ermittelt werden.
Hinweis:
Der Apache-Webserver wechselt beim Start das Arbeitsverzeichnis in das Wurzelverzeichnis, weshalb PHP versucht, die php.ini aus dem Wurzelverzeichnis zu lesen, wenn diese existiert.
Wie untenstehend gezeigt, können Umgebungsvariablen in php.ini verwendet werden.
Beispiel #1 php.ini Umgebungsvariablen
; PHP_MEMORY_LIMIT ist der Name einer Umgebungsvariablen memory_limit = ${PHP_MEMORY_LIMIT}
Die Optionen der php.ini für Extensions werden auf den Handbuchseiten der jeweiligen Extensions behandelt. Die Beschreibung der php.ini-Direktiven des Sprachkerns ist im Anhang verfügbar. Es werden jedoch möglicherweise nicht alle PHP-Direktiven im Handbuch erläutert. Für eine komplette Liste der in Ihrer PHP-Version verfügbaren Einstellungen lesen Sie bitte die gut kommentierte php.ini. Möglicherweise kann die » aktuellste php.ini aus dem Git-Repository ebenfalls hilfreich sein.
Beispiel #2 php.ini-Beispiel
; Jeder Text in einer Zeile nach einem Semikolon, welches nicht ; in Anführungszeichen steht, wird ignoriert [php] ; Abschnittsmarkierungen (Text in eckigen Klammern) werden ebenfalls ignoriert ; Boolesche Werte können auf einen der folgenden Werte eingestellt werden: ; true, on, yes ; oder false, off, no, none register_globals = off track_errors = yes ; Sie können Zeichenketten in Anführungszeichen einschließen include_path = ".:/usr/local/lib/php" ; Backslashes werden wie alle anderen Zeichen behandelt include_path = ".;c:\php\lib"
Es ist möglich, sich auf bereits definierte .ini-Variablen innerhalb der
.ini-Dateien zu beziehen. Zum Beispiel:
open_basedir = ${open_basedir}":/new/dir"
.
Es ist möglich, PHP so zu konfigurieren, dass nach .ini Dateien in einem Verzeichnis gesucht wird, nachdem php.ini gelesen wurde. Dies kann zur Kompilierzeit durch Setzen der Option --with-config-file-scan-dir erfolgen. Das Scan-Verzeichnis kann zur Laufzeit überschrieben werden, indem die Umgebungsvariable PHP_INI_SCAN_DIR gesetzt wird.
Es ist möglich, mehrere Verzeichnisse anzugeben, indem sie mit dem
plattformspezifischen Pfadtrenner (;
unter Windows,
NetWare und RISC OS; :
auf allen anderen Plattformen;
der Wert, den PHP verwendet, is als PATH_SEPARATOR
verfügbar). Wird in PHP_INI_SCAN_DIR ein leeres
Verzeichnis angegeben, dann wird PHP beim Kompilieren auch das mit
--with-config-file-scan-dir angegebene
Verzeichnis durchsuchen.
In jedem Verzeichnis wird PHP alle Dateien mit der Erweiterung
.ini
in alphabetischer Reihenfolge lesen. Eine gemäß der
Reihenfolge geordnete Liste der geladenen Dateien ist durch Aufruf von
php_ini_scanned_files() verfügbar, oder indem PHP mit der
Option --ini ausgeführt wird.
Wir nehmen an, dass PHP mit --with-config-file-scan-dir=/etc/php.d kompiliert wurde, und dass der Pfadtrenner : ist... $ php PHP wird alle Dateien in /etc/php.d/*.ini als Konfigurationsdateien laden. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php PHP wird alle Dateien in /usr/local/etc/php.d/*.ini als Konfigurationsdateien laden. $ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php PHP wird alle Dateien in /etc/php.d/*.ini, und dann /usr/local/etc/php.d/*.ini als Konfigurationsdateien laden. $ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php PHP wird alle Dateien in /usr/local/etc/php.d/*.ini, und dann /etc/php.d/*.ini als Konfigurationsdateien laden.
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.
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
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 . "/";