[RESOLU] Limite de la de mémoire.

Eléphant du PHP | 290 Messages

01 oct. 2014, 16:23

Bonjour,

Dans l'écriture d'une page en php je suis tombé sur
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 129 bytes) in
+ ma page

echo ini_get('memory_limit'); fait apparaître 128M
Je suppose que ça signifie que ma page ne doit pas dépasser un poids de 128 mégaoctets de mémoire vive.
Si j'ajoute maintenant dans mon code ini_set('memory_limit', '256M'); j'obtiens sur le navigateur:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 65488 bytes)
Quoi que je mette comme poids en paramètre dans ini_set('memory_limit', '...');
je vais toujours avoir un message d'erreur avec Allowed memory size légèrement supérieur au poids que j'aurais mis.
Si je mets un poids beaucoup plus important je me retrouve alors avec un message d'erreur Out of memory.
Ca ne fonctionne pas :(

Dans mon fichier php.ini-developement j'ai aussi essayé de changer
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M

par par exemple
; Maximum amount of memory a script may consume (256MB)
; http://php.net/memory-limit
memory_limit = 256M

et pareil dans php.ini-production où j'ai essayé de changer:
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M

par par exemple
; Maximum amount of memory a script may consume (256MB)
; http://php.net/memory-limit
memory_limit = 256M

Mais rien à faire :(
Ca ne marche toujours pas.
Même après avoir éteind puis rallumé les boutons du panneau de configuration.

Pour info, je travaille en local avec le package xampp.
J'ouvre mes fichiers php.ini avec le Bloc-notes.

Quelqu'un pourrait m'aider?

ViPHP
xTG
ViPHP | 7331 Messages

01 oct. 2014, 17:56

Et tu fais tourner quoi comme script ?
Parce que là j'ai envie de dire le php.ini fait son boulot quand on voit ce que tu mets...
Donc le souci c'est le script qui tourne et qui est un gouffre sans fond à mémoire. ;)

Eléphant du PHP | 290 Messages

01 oct. 2014, 18:45

Il s'agit d'un script pour un programme Ajax (réponse serveur) pour renouveler un calendrier mensuel,
mais Toytoy s'occupe déjà depuis un moment de m'aider à la mise en place du programme.

Comme il passe de son temps à m'aider depuis un moment, je ne voudrais pas demander à quelqu'un d'autre
de m'aider aussi sur les mêmes points, par respect pour ceux qui prennent de leur temps pour m'aider.

J'ai posté ce nouveau message sur le forum car après avoir cherché en vain toute la journée comment régler le problème
très précis dont je vous fais part, j'ai pensé que si quelqu'un peut me donner une réponse précise et rapide à ma question
je pourrais peut-être terminer seul le programme Ajax et éviter à Toytoy d'avoir plus de choses à voir,
car je sais qu'il a pas mal de boulot en ce moment. Et le but c'est aussi d'éviter à ceux qui nous aident de faire
ce qu'on peut faire nous.
Mais si c'est en fait plus compliqué que ça de résoudre le problème c'est plus pareil car ça vous implique davantage,
et je ne vais pas vous impliquer dans le détail de mon code car Toytoy lui s'en occupe déjà.

Je voudrais savoir à quoi tu fais référence exactement quand tu dis "quand on voit ce que tu mets..."
Est-ce que tu fais référence au résultat retourné par le navigateur:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 129 bytes)
?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 oct. 2014, 19:41

salut,

le message d'erreur indique la taille max.
si tu prend les deux valeurs que tu divise deux fois par 1024 (c'est de octect, tu divise par 1024 tu as de ko tu divise par 1024 des Mo) tu aura 128 et 256.

ensuite la quantité annoncée derrière c'est la valeur où il stop pas la valeur max.

maintenant comme l'indique xTG tous ce que l'on peux te dire c'est que php fait bien son boulot en stop à la limite de mémoire paramétrée.

tu te rend compte, je pense, qu'utiliser plus de 128Mo c'est énorme. celà peux arriver dans le cas de traitement d'image (avec gd) ou si tu veux récupérer tous le contenu d'un gros fichier par exemple.


je t'invite à utiliser un xdebug ave le mode de profilage tu devrais pouvoir suivre les utilisations mémoires et plus des goulets de terme de temps.
si tu utilise le debuguer tu pourra aussi jouer ton script pas a pas et voir le code qui vautre le script.

quoi qu'il en soit on ne pas t'aider plus dasn la devinette sans code ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 290 Messages

02 oct. 2014, 15:21

Merci pour toutes ces précisions.

A ma question de savoir comment allouer plus de mémoire à mon script,
vous m'avez fait savoir que ce n'est pas ça qu'il faut que je fasse,
qu'il faut au contraire que je fasse diminuer le poids de mon fichier.

Il s'agit donc d'un autre problème que je posterai peut-être si besoin,
mais vous avez bien répondu à ma question quant à savoir comment allouer plus de mémoire à mon script
(=>la question ne se pose pas car ce n'est pas ce qu'il faut faire).
Je mets donc le problème résolu.

Je vais d'abord continuer de travailler avec Toytoy car il s'occupe de mon dossier pour l'instant.

Juste une remarque: le chiffre de 1024 vérifie parfaitement tes calculs.
C'est très intéressant.
Ca l'est d'autant plus que la moitié de 1024 est 512, et la moitié de 512 est 256.
Ces trois chiffres me sont familiers.
Déjà 1 octet = 2^8 valeurs = 256 valeurs.
Quand à 512 j'ai déjà souvent vu ça quelque part quand on parle de mémoire.
J'ai l'impression que tout ça c'est très lié. :D
Si tu peux m'expliquer ces liens en trois lignes ça m'intéresse beaucoup.
Mais quoi qu'il en soit je mets dès maintenant ce message comme résolu.

ViPHP
xTG
ViPHP | 7331 Messages

02 oct. 2014, 15:32

Cela a un lien avec le hardware en fait (ou la logique binaire).
Dans une mémoire pour rajouter de la place il faut rajouter des bits.
Or quand on rajoute un bit cela revient à multiplier le nombre de combinaison par deux (2^bit), et donc la taille.

Eléphant du PHP | 290 Messages

02 oct. 2014, 15:46

Merci pour l'explication :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 oct. 2014, 11:14

pour aller plus loin c'est en fait une série mathématique.
c'est la somme de zéro à n de 2^n
la chose s'applique à d'autre base de numération (le binaire étant une base 2, le système décimale que l'on utilise tous les jours en base 10).
en informatique il existe une base que tu utilise régulièrement : la base 16 ou hexadécimal (que tu utilise par exemple pour les codes couleurs css / html).
la base 8 est aussi utilisée (octal).
le cal étant similaire.

Régulièrement en informatique tu vois des division par 1000 c'est de la foutaise purement commercial.
(regarde la différence entre l'étiquette de ton disque dur / clef usb et la valeur réelle indiquée par ton ordi ;) ).

dernière chose, nous on parle d'octect mais les anglo saxo de byte à ne pas confondre avec un bit (non y a pas de e ^^) qui est la même chose par tout et représente l'unité (un octect = 8 bit).

si tu veux encore plus d'info il te faut cours sur d’électronique ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 290 Messages

03 oct. 2014, 17:58

Merci pour les précisions.

Si je résume...


Donc 134 217 728 bytes = 134 217 728 octets et
268 435 456 bytes = 268 435 456 octets.

Tu me dis 134 217 728 octets / (1024*1024) = 128M et
268 435 456 octets / (1024*1024) = 256M.
En vérifiant cela ci-dessous.

Sachant que 1024 * 1024 = 2^20.
128M = 2^7M = 2^7 * 10*6 octets.
256M = 2^8M = 2^8 * 10*6 octets.

134 217 728 octets / 2^20 = 2^7 * 10^6 octets et
268 435 456 octets / 2^20 = 2^8 * 10*6 octets.
134 217 728 octets = 2^7 * 10^6 * 2^20 octets = 2^27 * 10^6 octets et
268 435 456 octets = 2^8 * 10^6 * 2^20 octets = 2^28 * 10^6 octets.

134 217 728 octets = 2^27 octets et non 2^27 * 10^6 octets.
et
268 435 456 octets = 2^28 octets et non 2^28 * 10^6 octets.

Donc il y a une erreur.
En fait, les deux fois 1024 dont tu parles sont des mégaoctets et non
des octets.
Tu n'avais pas précisé, je ne savais donc pas l'unité utilisée...
Mais je me demande toujours comment tu as fait
pour penser à diviser respectivement 134 217 728 bytes (donc des octets)
et 268 435 456 octets (donc toujours des octets) par 2^20 * 10^6 octets
pour trouver dans le premier cas 128M et dans le deuxième 256M.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 oct. 2014, 20:20

ben pourtant si
c'est de octect, tu divise par 1024 tu as de ko tu divise par 1024 des Mo) tu aura 128 et 256.
Après c'est des unités usuel comme pour le mètre par exemple sauf que la c'est une division par 1024 et pas 1000 :)
1ko = 1024 o
1Mo = 1024 ko


1km = 1000 m
1Mm = 1000km => oui c'est pas vraiment usuel mais c'est pareil avec le mm :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 290 Messages

03 oct. 2014, 22:40

Merci pour l'info. :D
Mais quelque chose ne colle pas!
Une question très courte: pour ce qui est de 128M et 256M il s'agit bien
de mégaoctets, soit respectivement de 128 000 000 octets et de 256 000 000 octets?

Eléphant du PHP | 290 Messages

06 oct. 2014, 23:11

Ca y est, j'ai compris.

128M = 128 * 1024 * 1024 octets = 128 * 2^20 octets = 134 217 728 octets et
256M = 256 * 1024 * 1024 octets = 256 * 2^20 octets = 268 435 456 octets.

Sachant que 1024 = 2^10.
1024 * 1024 = 2^20.
1024 * 1024 * 1024 = 2^30.
...

La seule chose à savoir c'est:

Quand tu montes d'1 unité (exemples: de o à Ko ou de Ko à Mo) tu divises par 2^10 et à l'inverse tu multiplies.
Quand tu montes de 2 unités (de o à Mo ou de Ko à Go) tu divises par 2^20 et à l'inverse tu multiplies.
Quand tu montes de 3 unités (de o à Go) tu divises par 2^30 et à l'inverse tu multiplies.

Merci :wink: