ConFoo Montreal 2017 Calling for Papers

Die Konfigurationsdatei

Die Konfigurationsdatei 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:

  • Spezielle Orte für SAPI-Module (PHPIniDir-Direktive im Apache2, -c Kommandozeilenparameter in CGI und CLI, php_ini-Parameter in NSAPI, PHP_INI_PATH-Umgebungsvariable im THTTPD)
  • Die PHPRC-Umgebungsvariable. Vor PHP 5.2.0 wurde diese nach dem unten angegebenen Registrierungsschlüssel geprüft.
  • Seit PHP 5.2.0 kann die Position der php.ini-Datei für verschiedene Versionen von PHP gesetzt werden. Die folgenden Registrierungsschlüssel werden 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. 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], Wert von IniFilePath (nur unter Windows).
  • Aktuelles Arbeitsverzeichnis (außer CLI).
  • Das Webserververzeichnis (für SAPI-Module) oder das PHP-Verzeichnis (andernfalls in Windows).
  • Windows-Verzeichnis (C:\windows oder C:\winnt) (unter Windows) oder die --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.


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 Wert 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 Core-php.ini-Einstellungen ist im Anhang verfügbar. Es werden jedoch wahrscheinlich 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"

Seit PHP 5.1.0 ist es möglich, sich auf bereits definierte .ini-Variablen innerhalb der .ini-Dateien zu beziehen. Zum Beispiel: open_basedir = ${open_basedir}":/new/dir".

Scan directories

It is possible to configure PHP to scan for .ini files in a directory after reading php.ini. This can be done at compile time by setting the --with-config-file-scan-dir option. In PHP 5.2.0 and later, the scan directory can then be overridden at run time by setting the PHP_INI_SCAN_DIR environment variable.

It is possible to scan multiple directories by separating them with the platform-specific path separator (; on Windows, NetWare and RISC OS; : on all other platforms; the value PHP is using is available as the PATH_SEPARATOR constant). If a blank directory is given in PHP_INI_SCAN_DIR, PHP will also scan the directory given at compile time via --with-config-file-scan-dir .

Within each directory, PHP will scan all files ending in .ini in alphabetical order. A list of the files that were loaded, and in what order, is available by calling php_ini_scanned_files(), or by running PHP with the --ini option.

Assuming PHP is configured with --with-config-file-scan-dir=/etc/php.d,
and that the path separator is :...

$ php
  PHP will load all files in /etc/php.d/*.ini as configuration files.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP will load all files in /usr/local/etc/php.d/*.ini as
  configuration files.

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP will load all files in /etc/php.d/*.ini, then
  /usr/local/etc/php.d/*.ini as configuration files.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP will load all files in /usr/local/etc/php.d/*.ini, then
  /etc/php.d/*.ini as configuration files.


Version Beschreibung
7.0.0 Hash marks (#) are no longer recognized as comments.
5.3.0 Hash marks (#) should no longer be used as comments and will throw a deprecation warning if used.
5.2.0 The PHP_INI_SCAN_DIR environment variable can be set to override the scan directory set via the configure script.
5.1.0 It is possible to refer to existing .ini variables from within .ini files.

add a note add a note

User Contributed Notes 5 notes

edgardoboj at hotmail dot com
1 year ago
If you have multiple installations of PHP, and "php --ini" keeps loading the same configuration file for every version instead of the configuration file on the installation path, it might be worthy to check the windows registry.

I found a key on "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP\IniFilePath" that override any installation, which cause "php --ini" to crash stating a version mismatch with the extensions being loaded.

Deleting the key "HEKY_LOCAL_MACHINE\SOFTEARE\Wow6432Node\PHP" solved the problem.

I guess the key was created with a windows installer for IIS on FastCGI, but just guessing.

For the record, some of the errors thrown are:
"The procedure entry point php_sys_stat could not be located in the dynamic link library php5.dll. "
"The procedure entry point php_checkuid could not be located in the dynamic link library php5.dll. "

Hope someone with such a mess will find this useful.
Nacho Esviza - ignacio at esviza dot com
2 years ago
This solution works for me when I needed to force two diferent versions of PHP on a Windows Server 2012 r2 & IIS:

For one application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php53\php-cgi.exe -c C:\php53\php.ini"

For the other application, map *.php extension to a CgiModule adding the "-c" option to the executable path, like this: "C:\php54\php-cgi.exe -c C:\php54\php.ini"

I think that way is the cleanest, because there is no need to work with PATH variable or Registry or Windows directory.

Note: for some reason, this didn't work on FastCGI module, related to the way that IIS set the executable tab not allowing command line options.
pajoye at php dot net
2 years ago
Also a nice feature is the ability to use PHP's contants:
For example:
emil at ncube dot ca
2 years ago
Note that the CLI version of PHP does not appear to take into account any php.ini configuration file. As such, something like a max_execution_time limit setting you may think is being applied is actually not being used, and instead defaulting to 0 (which is unlimited).
Greg Robson
3 years ago
If you are on Windows and the

php --ini

command is showing the path you do not want, check the PATH environment variable.

The command line was looking for php.ini in the folder where it found php.exe. In my case this meant it was looking in
c:\Program Files (x86)\php\5.2.6
and not

Might easily be overlooked when adding new versions to your computer.
To Top