Les réglages de PHP

L’objectif de cette page de sensibiliser les développeurs PHP aux possibilités trop peu connu de paramétrage qu’offre les fichiers .htaccess et .user.ini

De quoi parle-t-on ?

Les directives sont des variables permettant de changer le comportement de PHP. À titre d’exemple il s’agit de memory_limit et consorts.
Merci de consulter la documentation avant de modifier une directive.
Vous trouverez la liste exhaustive des directives à la page suivante : https://www.php.net/manual/fr/ini.list.php


Ce qu’il faut principalement retenir de cette documentation c’est qu’il est possible d’initialiser les directives à 3 niveaux :

  1. PHP_INI_SYSTEM : Directives initialisables uniquement dans php.ini
  2. PHP_INI_PERDIR : Directives initialisables dans php.ini, .htaccess ou .user.ini
  3. PHP_INI_ALL : Directives initialisables partout (y compris depuis vos scripts)


On notera également qu’Il existe plusieurs manières d’interpréter des scripts PHP :

  • via le binaire php (en CLI)
  • le module apache
  • php-fpm

Attention, chaque méthode d’interpretation de PHP dispose de son propre fichier php.ini ou équivalent.

On récapitule

Les différents fichiers de configuration

Comme expliqué au dessus chaque méthode d’interprétation a ses fichiers de configuration particulier, il convient donc de les utiliser de façon pertinente.
Par exemple si l’on souhaite modifier le memory_limit d’un script exécuté en ligne de commande, il convient d’éditer le php.ini utilisé par php en CLI ou bien de préciser au binaire php d’utiliser un php.ini spécifique.

Les différents niveau de « modifiable »

Il faut bien comprendre le fonctionnement des « niveaux de directives » expliqué au dessus (system, perdir, all).
Par exemple la directive asp_tags (qui sert à autoriser php à interpréter d’autres formes de tags) est une directive PHP_INI_PERDIR, ce qui signifie qu’elle ne peut pas être modifié depuis un code source (à l’aide de ini_set()), mais elle peut être modifié depuis un .htaccess, ou un .user.ini, sa valeur pourra également être modifié dans le fichier système php.ini.

Priorités des directives

Si une directive a une valeur différente sur plusieurs niveaux (si elle a été redéfinie) c’est le plus spécifique qui est prioritaire.
Par exemple si memory_limit qui est une directive PHP_INI_ALL est définie à la fois dans le php.ini avec une valeur de 64M, dans un .user.ini avec une valeur de 512M et dans le code grace à une fonction ini_set() avec une valeur de 256M, c’est la valeur définie avec l’ini_set qui s’applique donc memory_limit=256M.

J’utilise quoi, où?

Pour le module PHP du serveur apache 

Vous pouvez modifier les directives php de niveau PHP_INI_PERDIR et inférieures dans le fichiers .htacces que vous placerez à la racine d’un site. Pour rappel, bous pouvez également mettre un .htaccess par répertoire fils (sous-répertoire).
exemple :
php_value memory_limit 64M

Pour le serveur php-FPM cgi-bin/fcgi

Vous pouvez, dans chaque répertoire, créer un fichier « .user.ini ». Vous ne pouvez créer qu’un seul .user.ini par répertoire. Vous pourrez dans ce fichier modifier les directives de niveau PHP_INI_PERDIR et PHP_INI_ALL.
exemple :
memory_limit=64M
Attention le fichier .user.ini fonctionne comme une spécialisation de votre php.ini, c’est-à-dire que vous pourrez faire les mêmes modifications que vous auriez faites dans votre php.ini (pour des directives PERDIR et ALL). Cette remarque s’adresse particulièrement aux utilisateurs de .htaccess: php-fpm est un « serveur web » il n’est pas un proxy. Vous ne pouvez donc pas par exemple donner au .user.ini une configuration de rewrite rules comme vous l’auriez fait pour un .htaccess sur apache.

Dans le code source

Toutes les directives ayant un niveau PHP_INI_ALL sont modifiables directement dans le code source de vos scripts.
exemple :
ini_set('memory_limit','32M');

Pour tous et toutes les valeurs

Il est possible de modifier toutes les directives depuis le php.ini qui va bien (mais on est d’accord que l’objectif de cet article était justement d’éviter cela).

Quand est ce que ces modifications sont appliquées ?

Cela dépend de la méthode choisie, si vous modifiez le php.ini ou le .user.ini il faudra que la configuration soit relue et donc un reload du serveur web est nécessaire (par défaut les .user.ini relus toutes les 5 minutes cf : la valeur user_ini.cache_ttl). Pour les autres méthodes, les htaccess (ou le code source) sont lus à chaque fois et donc pas besoin de reload.

Note sur les performances

Comme vous pouvez vous en douter, si l’interpréteur doit aller lire à chaque fois les configurations dans chaque répertoire, cela n’est pas optimal pour les performances, notamment pour celles des disques… Cependant on constate à l’usage que l’impact est négligeable.
Ces considérations s’appliquent donc essentiellement aux sites avec un très fort trafic (plusieurs milliers de requêtes par seconde) ou avec des configurations très exotiques.

Pour aller plus loin :
https://www.php.net/manual/fr/configuration.file.per-user.php
https://www.php.net/manual/fr/ini.list.php