Serveur Ubuntu 16.04 : augmenter la limite de mémoire de PHP

Pour augmenter la limite de mémoire de PHP fonctionnant comme module Apache sur Ubuntu 16.04, modifiez la valeur memory_limit dans le fichier PHP php.ini correspondant, puis redémarrez Apache et vérifiez la valeur appliquée dans une requête web. Comme PHP-FPM ou PHP en ligne de commande peuvent utiliser des fichiers de configuration différents, vous devez d'abord vérifier la méthode d'exécution.

Portée d'application et vérification avant modification

Cet article est un exemple d'inspection d'un serveur existant basé sur PHP 7.0 et le module Apache sur Ubuntu 16.04. Le support de sécurité général pour Ubuntu 16.04 est terminé, et après une maintenance de sécurité prolongée, un support Legacy séparé peut s'appliquer. Vérifiez le champ d'application dans Calendrier de maintenance de sécurité d'Ubuntu et planifiez la migration vers un environnement pris en charge.

memory_limit est un paramètre qui limite la mémoire qu'un script PHP peut allouer. Ce n'est pas la mémoire maximale de la mémoire physique installée sur le serveur ni la mémoire totale partagée par plusieurs requêtes. L'augmentation de la limite peut accroître la charge mémoire du serveur en fonction du nombre de requêtes simultanées, donc vérifiez à la fois la mémoire disponible et les erreurs réelles. La valeur par défaut peut varier en fonction des paramètres PHP et de l'application.

Trouver les paramètres PHP utilisés sur le web

Dans l'installation de base du module Apache PHP 7.0 sur Ubuntu 16.04, /etc/php/7.0/apache2/php.ini est utilisé. Cependant, le chemin peut varier en fonction de la version de PHP, de la méthode d'installation et des configurations séparées. PHP-FPM utilise généralement un fpm/php.ini séparé, et vous ne devez pas supposer que le résultat php --ini de la ligne de commande correspond aux paramètres d'une requête web.

Dans un environnement de test restreint, créez un fichier PHP temporaire dans le répertoire des documents web et insérez le code ci-dessous. Ouvrez le fichier dans un navigateur pour vérifier la méthode d'exécution, le chemin du fichier de configuration et la limite actuelle. Ne le placez pas dans un environnement public car des informations sur le serveur telles que les chemins de fichiers seront exposées, et supprimez-le immédiatement après vérification.

<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'SAPI: ' . PHP_SAPI . "\n";
echo 'Loaded ini: ' . php_ini_loaded_file() . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";

S'il s'agit de apache2handler, il utilise la méthode du module Apache, et s'il s'agit de fpm-fcgi, il utilise la méthode PHP-FPM. Si le fichier de configuration n'apparaît pas ou est différent de ce que vous attendez, vérifiez l'installation et la connexion au serveur web. PHP peut lire d'autres fichiers .ini en plus du fichier par défaut et les paramètres de l’application ou du serveur peuvent remplacer les valeurs. Pour plus de détails, consultez la documentation du fichier de configuration PHP.

Modification de memory_limit

Ce qui suit est un exemple lorsque le chemin vérifié sur le web est /etc/php/7.0/apache2/php.ini. S'il s'agit d'un chemin différent, appliquez-le au fichier que vous avez réellement vérifié. Avant de modifier, assurez-vous qu'il n'y a pas encore de fichier de sauvegarde, et si un fichier de sauvegarde existe déjà, changez le nom de la sauvegarde dans la commande ci-dessous par un nouveau nom.

sudo cp -a -n /etc/php/7.0/apache2/php.ini /etc/php/7.0/apache2/php.ini.before-memory-limit
sudo nano /etc/php/7.0/apache2/php.ini

Trouvez les paramètres memory_limit existants dans l'éditeur, modifiez-les avec les valeurs requises, et enregistrez. Par exemple, si la valeur existante est 128M et que vous constatez qu'une valeur plus élevée est nécessaire pour la tâche, vous pouvez essayer 256M. Les valeurs suivantes sont des exemples et ne sont pas des valeurs recommandées adaptées à tous les serveurs.

memory_limit = 256M

La valeur -1 supprime la limite ; ne l'utilisez pas de manière indiscriminée pour résoudre des problèmes. La cause d'une insuffisance de mémoire peut être une entrée volumineuse, un code inefficace ou des requêtes concurrentes. La signification des valeurs peut être trouvée dans la description PHP memory_limit.

Appliquer à Apache et vérifier

Dans la méthode du module Apache, exécutez d'abord une vérification de configuration. Syntax OK devrait apparaître pour passer à l'étape suivante. Si la vérification échoue, corrigez les erreurs puis vérifiez à nouveau. Cette vérification valide la configuration d'Apache et ne garantit pas que les limites PHP sont correctement appliquées dans les requêtes web.

sudo apache2ctl configtest

Si la vérification réussit, redémarrez Apache à un moment approprié. Le redémarrage peut affecter les connexions et les requêtes en cours, donc examinez l'impact sur l'environnement de production.

sudo systemctl restart apache2
sudo systemctl status apache2

Vérifiez que le service fonctionne normalement et demandez le fichier de vérification PHP à accès restreint créé précédemment pour voir si memory_limit affiche la valeur prévue. Après la vérification, supprimez le fichier temporaire. Assurez-vous également que les erreurs ne se reproduisent pas dans l'application réelle.

Dans le cas de PHP-FPM, la simple mise à jour des fichiers du module Apache ci-dessus et le redémarrage peuvent ne pas appliquer les paramètres FPM. Vérifiez le fichier de configuration FPM effectivement chargé et le nom du service utilisé, et suivez la procédure de vérification de configuration et de redémarrage pour ce service.

Lorsque ce n'est pas appliqué ou que des problèmes surviennent

Si la valeur vérifiée sur le web est différente, vérifiez si le chemin édité, la version de PHP et la méthode d'exécution sont corrects. La valeur peut également différer dans des fichiers .ini supplémentaires, les paramètres Apache, les paramètres du pool FPM et le ini_set() de l'application. Si des erreurs de mémoire se produisent même après les modifications, vous devez examiner le journal des erreurs, les détails du travail et l'utilisation de la mémoire du serveur ensemble.

Si vous devez annuler les modifications, vérifiez le contenu des fichiers de configuration sauvegardés et restaurez-les dans les fichiers d'origine, puis effectuez à nouveau une vérification de la configuration d'Apache et un redémarrage du service. Si le chemin de sauvegarde est différent de l'exemple, utilisez le chemin de sauvegarde réel. Vous pouvez également conserver séparément la configuration actuelle avant la restauration pour comparer les modifications.