En bref : le php.ini est le fichier de configuration central de PHP. PHP le lit au démarrage, une fois pour les modules serveur, à chaque appel pour CGI et CLI. S'y ajoutent des fichiers complémentaires d'un répertoire d'analyse, des réglages dans le pool FPM ou dans Apache, .htaccess ou .user.ini, et ini_set() dans le code. Le niveau autorisé à modifier une valeur est défini par son mode de modification, par exemple INI_SYSTEM ou INI_PERDIR. Les valeurs définies via php_admin_value ne peuvent plus être écrasées par l'application.
Qu'est-ce que le php.ini ?
Le php.ini est un fichier texte contenant des entrées de la forme name = wert. Il détermine le comportement de PHP : quelle quantité de mémoire un script peut utiliser, si les erreurs s'affichent dans le navigateur, comment fonctionnent les sessions et quelles extensions sont chargées. Les commentaires commencent par un point-virgule.
Selon le manuel PHP, le fichier est lu au démarrage de PHP. Avec les modules serveur comme mod_php, cela n'a lieu qu'une fois, au démarrage du serveur web ; avec CGI et CLI, à chaque appel. PHP-FPM lit sa configuration au démarrage et lors du rechargement du service. Une modification sans redémarrage ni rechargement n'agit donc le plus souvent pas.
Depuis PHP 8.3, selon le manuel, une entrée peut renvoyer à une variable d'environnement avec une valeur de repli :
memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME:-30}
Où PHP cherche-t-il le php.ini ?
Le manuel décrit un ordre fixe. D'abord s'applique un chemin explicitement défini, par exemple PHPIniDir dans Apache ou l'option -c pour CGI et CLI. Sinon, PHP construit un chemin de recherche à partir de :
- la variable d'environnement
PHPRC, - sous Windows, l'entrée de registre
IniFilePath, - le répertoire de travail actuel, sauf pour les SAPI qui le désactivent, comme la CLI,
- le répertoire du binaire PHP ou du module,
- le chemin défini à la compilation,
--with-config-file-path.
Dans ce chemin de recherche, PHP cherche d'abord un fichier php-SAPI.ini, par exemple php-cli.ini, et seulement ensuite php.ini. PHP lit ensuite, dans l'ordre alphabétique, tous les fichiers .ini du répertoire d'analyse, défini via PHP_INI_SCAN_DIR ou, à la compilation, via --with-config-file-scan-dir. php --ini ou la fonction php_ini_scanned_files() indiquent quels fichiers ont été chargés.
php --ini
php -r 'var_dump(php_ini_loaded_file(), php_ini_scanned_files());'
Les deux commandes montrent l'état de la ligne de commande. Pour le site web, un autre fichier peut s'appliquer, car chaque SAPI peut avoir sa propre configuration ; plus de détails sous SAPI expliquée.
Modes de modification : qui peut définir quelle valeur ?
Tous les réglages ne peuvent pas être définis partout. Le manuel attribue à chaque directive un mode de modification :
| Mode | Où la valeur peut être définie |
|---|---|
INI_USER |
dans les scripts par ini_set(), dans le registre Windows et dans .user.ini |
INI_PERDIR |
dans php.ini, .htaccess, httpd.conf ou .user.ini |
INI_SYSTEM |
uniquement dans php.ini ou httpd.conf |
INI_ALL |
partout |
Exemples tirés du manuel : memory_limit a le mode INI_ALL et la valeur par défaut 128M, post_max_size a INI_PERDIR et la valeur par défaut 8M, upload_max_filesize a INI_PERDIR et la valeur par défaut 2M. expose_php ne peut figurer que dans le php.ini.
Selon le manuel, les fichiers .user.ini ne sont lus que par les SAPI CGI et FastCGI, donc aussi par PHP-FPM. PHP les cherche depuis le répertoire du script en remontant jusqu'au Document Root et ne les relit par défaut qu'au plus toutes les 300 secondes (user_ini.cache_ttl). Avec mod_php, c'est .htaccess qui joue ce rôle.
Quelle valeur s'applique au final ? Les niveaux et leur priorité
En simplifiant : plus un niveau intervient tard, plus sa valeur a de chances de l'emporter, pour autant que le mode de modification l'autorise.
- php.ini de la SAPI concernée
- Fichiers complémentaires du répertoire d'analyse, par ordre alphabétique
- Configuration du serveur : pool FPM avec
php_valueouphp_admin_value, VirtualHost Apache - Niveau du répertoire :
.htaccessavec mod_php,.user.iniavec FPM et CGI - Exécution :
ini_set()dans le code de l'application
L'exception est déterminante : selon le manuel, les valeurs définies via php_admin_value ou php_admin_flag ne peuvent pas être écrasées par ini_set(). Les administrateurs verrouillent ainsi des réglages sensibles pour la sécurité contre l'application. Cela est décrit en détail sous php_admin_value : verrouiller les réglages contre l'écrasement.
Le php.ini après PHP2Shell : ce qui a changé
Les mesures transitoires de php.net concernant PHP2Shell sont presque toutes des réglages INI : memory_limit=-1 verrouillé contre l'écrasement, post_max_size limité, session.upload_progress.enabled=0 et, sur PHP 8.5, fatal_error_backtraces=0. php.net souligne que session.upload_progress.enabled ne doit pas être défini via ini_set() ou .user.ini, mais dans le php.ini, le pool FPM ou la configuration du serveur, suivi du redémarrage de tous les workers. La liste complète figure sous Mesures immédiates si vous ne pouvez pas encore corriger.
Avec les versions corrigées 8.5.12, 8.4.27, 8.3.36 et 8.2.35, selon le manuel, memory_limit a aussi changé : c'est désormais une limite souple. Le nouveau réglage memory_hard_limit_percent fixe une limite stricte. Sans valeur propre, elle vaut le double de memory_limit ; au-delà de 1G, la valeur plus 1G. Si elle est dépassée, le processus se termine immédiatement avec le statut de sortie 137. Pour bien choisir les deux limites, voir Bien définir memory_limit.
Selon le manuel : si une version de PHP ne reconnaît pas memory_hard_limit_percent, elle est concernée par CVE-2026-109618 et CVE-2026-109619. Pour les distributions avec rétroportages, le journal des modifications du paquet prouve en outre l'état.
Comment PHP SOS aide-t-il concrètement ?
- Déterminer les valeurs effectives : nous relevons pour chaque SAPI quels fichiers sont chargés et quelle valeur s'applique au final.
- Nettoyer les niveaux : nous supprimons les entrées contradictoires des panneaux, pools,
.htaccesset.user.ini. - Poser des verrous : dans le cadre du durcissement de serveur, nous fixons les valeurs sensibles pour la sécurité par
php_admin_value. - Apporter la preuve : nous documentons les réglages et le redémarrage, afin que l'état puisse être démontré plus tard.
Questions fréquentes
Où se trouve le php.ini ?
Cela dépend du système d'exploitation, du paquet et de la SAPI. Sous Debian et Ubuntu, il existe des dossiers distincts par version et par SAPI, par exemple /etc/php/8.3/fpm/php.ini et /etc/php/8.3/cli/php.ini. En ligne de commande, php --ini affiche les fichiers chargés ; pour le site web, php_ini_loaded_file() dans un fichier de test déposé brièvement aide.
Dans quel ordre les fichiers du dossier conf.d sont-ils lus ?
Selon le manuel PHP, PHP lit tous les fichiers portant l'extension .ini du répertoire d'analyse dans l'ordre alphabétique. Les fichiers suivants écrasent les valeurs des précédents. C'est pourquoi de nombreux fichiers portent des nombres comme 20- ou 99- dans leur nom.
Pourquoi ma modification du php.ini n'a-t-elle aucun effet ?
Raisons fréquentes : le fichier d'une autre SAPI a été modifié, le service n'a pas été redémarré, une valeur dans le pool FPM, dans la configuration d'Apache ou dans un .user.ini l'écrase, ou un panneau d'hébergement réécrit le fichier lors de la prochaine sauvegarde.
Qu'est-ce que memory_hard_limit_percent ?
Un nouveau réglage qui, selon le manuel PHP, a été introduit avec les versions de sécurité du 21/10/2026. Il fixe une limite de mémoire stricte sous forme de pourcentage de memory_limit. Le manuel précise qu'une version de PHP qui ne connaît pas ce réglage est concernée par les failles PHP2Shell.