77 votes

PHP: les limites de mémoire des paramètres> 1024M ne fonctionnent pas

Pour de mauvaises raisons, j'ai besoin de définir memory_limits plus élevés que 1 Go pour un répertoire, mais sur mon PHP 5.2.17 sur un serveur Debian 5.0 (Lenny), lorsque j'utilise, par exemple, 2048M, je n'obtiens que la valeur par défaut de php.ini (256M).

PHP fonctionne en tant que module Apache, et phpinfo nous donne (pour le répertoire) :

memory_limit    1024M    256M
suhosin.memory_limit    0    0

Y a-t-il une limitation due à un module Apache, ou à la configuration PHP ? Je sais que le serveur possède seulement 4 Go de RAM. Il s'agit juste d'un script spécial.

3 votes

Je suis dans la même situation en ce moment. Je comprends tellement le : "Pour de mauvaises raisons"!

0 votes

140voto

kristovaher Points 2001

Comment essayez-vous de définir la limite de mémoire? phpinfo() affiche la limite de mémoire PHP réservée actuelle, et c'est ce qui est disponible en raison du fait que le fichier php.ini a fixé une limite de mémoire.

Écrire ceci dans le fichier Apache .htaccess de votre répertoire de script pourrait fonctionner si votre serveur prend en charge le réglage des commandes PHP via .htaccess:

php_value memory_limit 2048M

Comme il se peut que les commandes .htaccess pour définir les valeurs PHP soient désactivées. Vous pouvez également essayer ceci depuis le code PHP:

ini_set('memory_limit', '2048M');

Si cela ne fonctionne pas et que .htaccess ne fonctionne pas non plus, alors vous devez contacter les administrateurs du serveur.

2 votes

Je utilize php_value ou ini_set, même problème : si je mets 512M ou 1024M, c'est bon, si je mets 1500M ou 2048M, j'obtiens 256Mo (la valeur par défaut de php.ini)

1 votes

Dans ce cas, il semble que cela dépasse les capacités du PHP, quelle est la valeur maximale que vous pouvez allouer ou est-ce que 1024M est le maximum?

0 votes

Nous pouvons faire un malloc() de 4,5 Go. Ai-je bien compris votre réponse ?

38voto

Nitrogen Points 79

J'ai eu le même problème où j'avais besoin que mon script PHP utilise 4 Go de RAM. La raison n'a pas d'importance. L'objectif était de définir une limite de 4 Go en PHP.

L'idée initiale était d'utiliser ini_set('memory_limit', '4096M');, mais j'ai trouvé que cela ne fonctionnait pas. Je n'ai aucune idée de comment ou pourquoi pour être honnête, mais cela n'était pas important pour moi à l'époque. Je suis sur un système avec 32 Go de RAM, et cela doit être possible.

J'ai découvert qu'en définissant une limite de 1 Mo de moins fonctionnait effectivement, et c'est une solution qui a fonctionné pour moi.

ini_set('memory_limit', '4095M'); // 4 Go moins 1 Mo

En fait, je n'avais jamais vraiment joué avec ça avant, mais j'ai remarqué sur mon système que cette valeur semble supprimer complètement toutes les limites de mémoire pour moi. Je suis capable d'utiliser autant de RAM que mon système fournit éventuellement.

0 votes

Avez-vous compris pourquoi 4096 Mo ne fonctionne pas ? Cela m'est arrivé avec PHP 7. Ce "bug" (je ne sais pas si c'en est un) n'a rien affiché sur la page ni généré d'erreurs. J'ai également activé error_reporting.

0 votes

Je viens aussi de rencontrer ce bogue avec PHP 7.1. Dès que je l'ai réglé sur 4095M, il s'est remis à fonctionner. En supposant que cela soit pour une utilisation en CLI, il serait peut-être préférable de le régler simplement sur -1 dans les cas où vous avez besoin de plus de 4 Go de mémoire.

1 votes

La raison de la libération de la memory_limit par cette valeur est que la valeur doit être un entier, qui a une limite de 2 ^ 31 (2G) sur la version PHP 32b, peu importe si vous l'exécutez sur un OS 64b. Tout ce qui est plus grand est stocké sous forme de flottant (format IEEE754) et ré-interprété en tant qu'entier (LE ou BE, en fonction de l'architecture). S'il arrive à être inférieur à zéro, il libère la limite. De toute façon, cela entraîne un comportement indéfini.

29voto

pollux1er Points 119
ini_set("memory_limit",-1);

Cela devrait normalement supprimer les limites

9 votes

Définir une valeur négative (-1) signifie qu'elle peut prendre autant d'espace en fonction de la capacité mémoire réelle de la machine utilisée

26 votes

Ceci est une très mauvaise pratique dans un environnement de production réel.

0 votes

@walther, pourquoi dis-tu cela ? Est-ce que cela fonctionne ou pas ?

9voto

La limite de

ini_set('memory_limit', '4095M'); // 4 Go moins 1 Mo

est liée au système d'exploitation (SE). Avec un SE 32 bits, vous devez utiliser cette limite maximale.

J'ai résolu un problème avec memory_limit aujourd'hui en utilisant cette solution de contournement.

En utilisant une limite plus élevée, PHP a un comportement étrange. Il retourne une mémoire épuisée dans certaines méthodes de classe non statiques publiques lorsqu'une classe a été instanciée, mais en mettant un die() dans la méthode __construct (pour tester le problème).

0 votes

Pour clarifier, consultez mon commentaire en réponse à la réponse de nxasdf.

6voto

Vincent Touzet Points 61

Comme décrit dans _Hardened-PHP - Configuration_, Suhosin ne vous permettra pas de définir une valeur supérieure à celle avec laquelle le script a démarré.

Si vous définissez le suhosin.memory_limit à 2048M, vous pourrez alors augmenter votre utilisation de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X