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 :

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++;
}
?>
l'objet du script est donc de bourrer un string de lignes de aaaaaaaaaaaaaaaaaaaaa à 1024 octets chacune.

chez moi la memory_limit est à 32M donc on arrive rapido à

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
 
$
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.


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)