Page 1 sur 1

allocation mémoire PHP5

Posté : 23 mars 2006, 11:46
par petitpiaf
Bonjour,

le script de test suivant tourne correctement sour PHP (memory_limit de 12 Mo) mais plante sous PHP5 avec le même memory_limit (erreur 500: unable to allocate xxxx bytes).
Pour qu'il tourne sous PHP5, je dois réduire le nombre d'itérations à 65560 environ ce qui sous entendrait que PHP5 alloue en gros trois fois plus de mémoire pour la même opération (bizarre non?).
Comme j'en doute et que mon hébergeur fait l'autiste en refusant de s'occuper du problème, y aurait-il une bonne âme pour tester ce script sur sa config PHP5 en ajustant bien sur le nombre d'itérations en fonction de son memory_limit, pour me dire si il y a une différence en le faisant tourner sous PHP et sous PHP5.

Le scipt:

<?php
echo "<br> valeur de memory_limit = ".@get_cfg_var('memory_limit')."";
echo "<br> mem_get_usage avant la boucle:".memory_get_usage()."";
$elem = array ();
for ($i=0;$i <179920;$i++) {
$elem[$i] ='0';
}
echo "<br> mem_get_usage après la boucle:".memory_get_usage()."";
?>

Merci d'avance.

Posté : 23 mars 2006, 23:00
par Hubert Roksor
Je ne suis pas au courant de changements sur la gestion interne des tableaux entre PHP 4.4 et PHP 5.0, mais sache toutefois que créer un tableau de plusieurs (centaines de!) milliers d'entrée n'est pas une bonne idée en PHP. Non seulement ça prend énormément de mémoire mais en plus c'est très lent. Tu devrais peut-être chercher une autre approche, essaie de poster ce que tu fais réellement avec ce tableau, et pourquoi tu le fais, on pourra peut-être trouver une meilleure solution.

De plus, même si PHP est très flexible à ce sujet, une chaîne est une chaîne, et un nombre est un nombre (sauf en ce qui concerne les clés des tableaux, qui sont toutes des chaînes, mais c'est un autre problème). Si ton tableau doit contenir des nombres alors utilise des nombres, par exemple:
// Ajouter un 0 au tableau
$elem[] = 0;

// Les résultats des bases de données sont toujours considérés comme
// des chaîne, convertir en nombre grâce à (int) ou intval()
// Par exemple, récupérons l'âge de tous nos utilisateurs
$sql = 'SELECT id, age FROM utilisateur';
$result = mysql_query($sql);

$age_utilisateurs = array();
while ($row = mysql_fetch_assoc($result))
{
   $age_utilisateurs[$row['id']] = (int) $row['age'];
}
Au fait, inutile d'utiliser $elem[$i], tu peux faire un simple $elem[] si tu ne fais qu'empiler des données. Voir http://fr.php.net/manual/fr/language.ty ... .modifying

Posté : 23 mars 2006, 23:05
par Hubert Roksor
J'ai oublié de préciser qu'en dehors d'être plus "pur" d'un point de vue théorique, utiliser un entier (à la place d'une chaîne) pour stocker un nombre entier utilise toujours moins de mémoire et est plus rapide.

Ce n'était qu'un exemple

Posté : 24 mars 2006, 13:45
par petitpiaf
Merci Hubert,

je me suis mal fait comprendre, le script que j'ai indiqué n'a été crée que pour tester la mémoire. Il n'a rien à voir avec ce que j'ai réellement à faire.

Mon but était d'écrire un script qui alloue délibérément de la mémoire (la performance était donc totalement étrangère à mes préoccupations) afin que quelqu'un puisse facilement le faire tourner sur une plateforme avec PHP5.

Je suis convaincu que le problème est chez mon hébergeur et qu'ils ont mal installé PHP5 (je n'est moi non plus jamais entendu parlé d'une gestion différente de la mémoire avec PHP5).
Pour le prouver et pousser mon hébergeur à agir, il faut que quelqu'un fasse tourner le même script sous PHP5 et qu'il me dise si le script fonctionne avec plus de 130.000 itérations comme c'est le cas sous PHP4.

Merci à toi si tu as l'occasion de faire ce petit test.

Re: allocation mémoire PHP5

Posté : 24 mars 2006, 14:28
par Hubert Roksor
le script de test suivant tourne correctement sour PHP (memory_limit de 12 Mo) mais plante sous PHP5 avec le même memory_limit (erreur 500: unable to allocate xxxx bytes)
Est-ce que c'est la même machine ? Si non, ça pourrait venir du gestionnaire de mémoire du système d'exploitation ou un truc du genre.

J'utilise les binaires précompilés de PHP sous Windows, et ils ne sont pas configurés pour respecter memory_limit, donc impossible pour moi de tester ce genre de fonctions :roll:

Re: allocation mémoire PHP5

Posté : 24 mars 2006, 15:38
par [BQS]Jayce
le script de test suivant tourne correctement sour PHP (memory_limit de 12 Mo) mais plante sous PHP5 avec le même memory_limit (erreur 500: unable to allocate xxxx bytes)
Est-ce que c'est la même machine ? Si non, ça pourrait venir du gestionnaire de mémoire du système d'exploitation ou un truc du genre.

J'utilise les binaires précompilés de PHP sous Windows, et ils ne sont pas configurés pour respecter memory_limit, donc impossible pour moi de tester ce genre de fonctions :roll:
sur un serveur Mandrake 10.2 avec php 5.1.2 cela me genere l'erreur suivante avec un memory_limit à 8M

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in /home/www/JS/js.php on line 6

Avec 12 M cela ne me genere pas d'erreur

valeur de memory_limit = 12M
mem_get_usage avant la boucle:31904
mem_get_usage après la boucle:8876312


met si je depasse 178999 iteration l'erreur revient

Super

Posté : 24 mars 2006, 19:12
par petitpiaf
Merci à tous les deux.

cela confirme ce que je pensais.

Merci infiniment.