Le fichier de configuration

Le fichier de configuration (php.ini) est lu par PHP au démarrage. Si vous avez compilé PHP en module, le fichier n'est lu qu'une seule fois, au lancement du serveur web. Pour les versions CGI et CLI le fichier est lu à chaque invocation.

Le php.ini est cherché dans ces endroits (et dans cet ordre) :

  • L'endroit spécifique du module SAPI (la directive PHPIniDir d'Apache 2, l'option de la ligne de commande -c en CGI et en CLI, le paramètre php_ini en NSAPI)
  • La variable d'environnement PHPRC.
  • L'endroit où se trouve le fichier php.ini peut être définis pour différentes versions de PHP. La racine des clés de registre dépend de l'architecture 32 ou 64 bit de l'OS et de PHP. Pour un OS et PHP 32 bit ou un OS et PHP 64 bit, utiliser [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] pour PHP 32 bit sur un OS 64 bit, utiliser [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP] à la place. Pour une installation avec la même architecture, les clés de registre suivantes sont cherchées dans cet ordre : [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] and [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], où x, y et z signifie les versions majeures, mineures et normales. Pour une architecture 32 bit de PHP sur un OS 64 bit, les clés de registre suivantes sont cherchées dans cet ordre : [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] and [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x], où x, y et z signifie les versions majeures, mineures et normales. S'il y a une valeur pour IniFilePath dans ces clés, la première trouvée sera utilisée comme endroit où se trouve le fichier php.ini (uniquement sous Windows).
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] ou [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP], valeur de IniFilePath (uniquement sous Windows).
  • Le dossier courant de travail (sauf pour CLI)
  • Le dossier du serveur web (pour les modules SAPI), ou le dossier contenant PHP (autrement sous Windows)
  • Le dossier Windows (C:\windows ou C:\winnt) (pour Windows), ou l'option de compilation --with-config-file-path lors de la compilation

Si le fichier php-SAPI.ini existe (où SAPI utilise SAPI, donc le nom du fichier est e.g. php-cli.ini ou php-apache.ini), il sera utilisé à la place du php.ini. Le nom SAPI peut être déterminé en utilisant la fonction php_sapi_name().

Note:

Le serveur web Apache change ce dossier en dossier root au démarrage, ce qui fait que PHP essaye de lire php.ini depuis le système de fichiers racine s'il existe.

Les variables d'environnements peuvent être utilisées dans le fichier php.ini comme ci-dessous.

Exemple #1 Les variables d'environnement dans un fichier php.ini

; PHP_MEMORY_LIMIT est repris depuis l'environnement
memory_limit = ${PHP_MEMORY_LIMIT}

Les directives php.ini sont directement documentées, par extensions, sur les pages respectives du manuel de ces extensions. La liste des directives internes est disponible en annexe. Il est probable que toutes les directives PHP ne sont pas documentées dans le manuel. Pour une liste complète des directives disponibles dans votre version de PHP, merci de lire les commentaires de votre propre fichier php.ini. Vous pouvez également trouver la » dernière version du php.ini sur Git.

Exemple #2 Extrait du php.ini

; tout texte sur une ligne, situé après un point-virgule ";" est ignoré
[php] ; les marqueurs de section (texte entre crochets) sont aussi ignorés
; Les valeurs booléennes peuvent être spécifiées comme ceci :
;    true, on, yes
; ou false, off, no, none
register_globals = off
track_errors = yes

; vous pouvez placer les chaînes de caractères entre guillemets
include_path = ".:/usr/local/lib/php"

; Les antislash sont traités comme n'importe quel caractère
include_path = ".;c:\php\lib"

Il est possible de se référer à des variables .ini depuis des fichiers .ini. Par exemple : open_basedir = ${open_basedir} ":/new/dir".

Lire un répertoire

Il est possible de configurer PHP pour lire les fichiers .ini présent dans un dossier. après la lecture de php.ini. Cela est réglé lors de la compilation avec l'argument --with-config-file-scan-dir. Le dossier à lire peut être modifié lors de l'exécution par la définition de la variable d'environnement PHP_INI_SCAN_DIR.

Il est possible de lire plusieurs dossiers en les séparant avec un séparateur de chemin spécifique à la plateforme (; pour Windows, NetWare et RISC OS; : pour toutes les autres plateforme; la valeur utilisée par PHP est disponible dans la contante PATH_SEPARATOR). Si un dossier vide est fourni dans PHP_INI_SCAN_DIR, PHP lira également le dossier fournis à la compilation via --with-config-file-scan-dir.

Dans chaque répertoire, PHP lira tous les fichiers terminant par .ini dans l'ordre alphabétique. Une liste des fichiers qui ont été chargé et dans quel ordre est disponible en appelant la fonction php_ini_scanned_files(), ou en exécutant PHP avec l'option --ini.

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

$ php
  PHP va charger tous les fichiers présent dans /etc/php.d/*.ini comme fichier 
  de configuration.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d php
  PHP va charger tous les fichiers présent dans /usr/local/etc/php.d/*.ini 
  comme fichier de configuration.

$ PHP_INI_SCAN_DIR=:/usr/local/etc/php.d php
  PHP va charger tous les fichiers présent dans /etc/php.d/*.ini, puis
  /usr/local/etc/php.d/*.ini comme fichier de configuration.

$ PHP_INI_SCAN_DIR=/usr/local/etc/php.d: php
  PHP va charger tous les fichiers présent dans /usr/local/etc/php.d/*.ini, puis dans
  /etc/php.d/*.ini comme fichier de configuration.

Historique

Version Description
7.0.0 Les marqueurs croisillons (#) ne sont plus reconnus comme des commentaires.
5.3.0 Les marqueurs croisillons (#) ne doivent plus être utilisés comme commentaires et vont lever un avertissement pour dépréciation si utilisé.
5.2.0 La variable d'environnement PHP_INI_SCAN_DIR peut être définie pour remplacer la valeur définie par le script de configuration.
5.1.0 Il est possible de faire référence à des variables existantes de .ini à l'intérieur de fichier .ini.

add a note add a note

User Contributed Notes 5 notes

up
1
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 . "/";
up
-30
david amick
7 years ago
example #2 says "[php] ; section markers (text within square brackets) are also ignored" - yet if you remove these 'section markers' everything breaks, - which means they're *not* ignored.
up
-36
Nacho Esviza - ignacio at esviza dot com
9 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.
up
-43
edgardoboj at hotmail dot com
8 years 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.
up
-53
pajoye at php dot net
9 years ago
Also a nice feature is the ability to use PHP's contants:
For example:
extension_dir=""PHP_MAJOR_VERSION"."PHP_MINOR_VERSION"/ext"
To Top