Aller au contenu

PHP : configuration

Fenêtre de terminal
php --ini # fichiers lus par la CLI
php -i | grep -E "Loaded Configuration|Scan this dir"
Contexte Fichier
CLI /etc/php/<version>/cli/php.ini
PHP-FPM (web) /etc/php/<version>/fpm/php.ini
Réglages additionnels /etc/php/<version>/fpm/conf.d/*.ini

Plutôt que d’éditer php.ini, créer un fichier conf.d dédié, qui survit aux mises à jour :

Fenêtre de terminal
sudo tee /etc/php/8.3/fpm/conf.d/99-monapp.ini <<'CONF'
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 25M
max_execution_time = 60
CONF
sudo systemctl reload php8.3-fpm

Remplacer 8.3 par 8.5 sur Ubuntu 26.04. Les fichiers sont lus dans l’ordre alphabétique : le préfixe 99- garantit qu’ils passent en dernier.

expose_php = Off
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_erreurs.log
error_reporting = E_ALL
html_errors = Off
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
Réglage Raison
display_errors = Off Ne pas afficher les erreurs aux visiteurs (chemins, requêtes SQL)
log_errors = On Les enregistrer dans un journal
expose_php = Off Ne pas annoncer PHP dans les en-têtes
session.cookie_* Cookie de session limité à HTTPS et inaccessible au JavaScript

Créer le journal avec les bons droits :

Fenêtre de terminal
sudo touch /var/log/php_erreurs.log
sudo chown www-data:adm /var/log/php_erreurs.log
display_errors = On
display_startup_errors = On
error_reporting = E_ALL

Sur un poste de développement uniquement (jamais sur un serveur public).

Réglage Rôle
memory_limit Mémoire maximale par requête (128M par défaut)
max_execution_time Durée maximale d’un script web, en secondes
upload_max_filesize Taille maximale d’un fichier téléversé
post_max_size Taille maximale d’une requête POST : au moins upload_max_filesize
max_input_vars Nombre maximal de champs de formulaire
date.timezone Fuseau horaire (Europe/Paris)

Côté serveur web, aligner aussi la limite de corps de requête (client_max_body_size pour Nginx), sinon un envoi volumineux échoue avant PHP.

Met en cache le code compilé : gain important en production.

opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

Avec opcache.validate_timestamps = 0, PHP ne relit plus les fichiers : recharger PHP-FPM à chaque déploiement (sudo systemctl reload php8.3-fpm). OPcache est activé par défaut pour PHP-FPM sous Ubuntu ; la CLI ne l’utilise pas (opcache.enable_cli = 0).

Fenêtre de terminal
php -i | grep memory_limit # CLI
php -r 'echo ini_get("memory_limit"), "\n";'

Pour le web, créer temporairement public/info.php :

<?php phpinfo();

Le lire dans le navigateur, puis le supprimer : il expose la configuration du serveur. Alternative sans exposition : sudo php-fpm8.3 -i.

Fenêtre de terminal
sudo phpenmod mbstring # active
sudo phpdismod xdebug # désactive
php -m # modules chargés
php --ri mbstring # détail d'une extension

PHP-FPM efface l’environnement : les définir dans le pool (env[APP_ENV] = production) ou charger un fichier .env en dehors de la racine web. Ne jamais versionner les secrets (voir Composer pour .gitignore).

Symptôme Piste
Réglage sans effet sur le site Mauvais fichier (CLI au lieu de FPM) ou service non rechargé : sudo systemctl reload php8.3-fpm
Allowed memory size of … bytes exhausted Augmenter memory_limit ou corriger la fuite
Téléversement qui échoue upload_max_filesize, post_max_size et limite du serveur web
Maximum execution time of 30 seconds exceeded max_execution_time ; pour un long traitement, utiliser la CLI
Page blanche display_errors désactivé : lire le journal d’erreurs
Avertissement date.timezone Définir date.timezone = Europe/Paris

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

La structure de /etc/php/<version>/ est identique ; seul le numéro de version change. Certaines directives php.ini sont retirées au fil des versions : après une migration vers 8.5, lancer php -i ou consulter le journal pour détecter les directives obsolètes.