j'aimerais comprendre la manière dont est gérée la mémoire dans php,
tout du moins en ligne de commande
(je précise que je suis actuellement php 5.2.4)
j'ai eu une ou deux fois des problemes d'erreur fatale de mémoire qui ne peut pas etre allouée.
j'ai fait qqs expériences, notament lle petit script suivant :
l'objet du script est donc de bourrer un string de lignes de aaaaaaaaaaaaaaaaaaaaa à 1024 octets chacune.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?php $line = str_repeat("a", 1023)."\n"; $data = ''; $i = 0; while (true) { echo number_format(strlen($data))."\n"; echo number_format(memory_get_usage())." \$i = $i \n"; $data .= $line; $i++; } ?>
chez moi la memory_limit est à 32M donc on arrive rapido à
ma compréhension ici c'est que lorsque le .= ne peut pas passer avec la quantité actuelle de mémoire, php au lieu de réallouer seulement 1024 octets (ce dont il a reellement besoin pour tt faire rentrer), va chercher à ajouter à la mémoire allouée la totalité du nouveau string.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $ php test.php ... 33,289,216 33,385,664 $i = 32509 33,290,240 33,386,688 $i = 32510 33,291,264 33,387,712 $i = 32511 Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33292289 bytes) in test.php on line 13 $
dans le manuel je ne trouve pas d'info à ce sujet (http://fr.php.net/manual/en/internals2.memory.php est vide)
y'a t'il un moyen de modifier ce comportement simplement ? (la manière dont php détermine la quantité de mémoire à s'allouer lorsqu'il se rend compte que ca ne passe plus).
(pas juste changer la limite de mémoire allouée je veux dire)
Partager