IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

allocation de mémoire [PHP 5.1]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 104
    Par défaut allocation de mémoire
    Bonjour à tous,

    Je rencontre actuellement un souci suite à l'apparition de la fameuse erreur

    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 1536 bytes)
    J'essaye de comprendre à quel endroit je dépasse la mémoire mais, pour moi, je ne la dépasse pas.

    Voici l'extrait de code où l'erreur apparaît:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    echo 'Memory in use: ' . memory_get_usage() . ' ('. memory_get_usage()/1024/1024 .'M) <br>';
    echo 'Memory limit: ' . ini_get('memory_limit') . '<br>';
    $valeur_id_group = '';
    $i_cpt=0;
    while ($i_cpt<count($tab_grp)) // $max est un tableau
    {
    	$id_groupe = $tab_grp[$i_cpt];				
    	$login_gest_groupe = get_login_gest_group($id_groupe);
    	if (ereg($login_gest,$login_gest_groupe))
    	{
    		if ($valeur_id_group == '') $valeur_id_group = "'".$id_groupe."'";
    		else $valeur_id_group .= ",'".$id_groupe."'";
    	}
    	echo 'Memory in use: ' . memory_get_usage() . ' ('. memory_get_usage()/1024/1024 .'M) <br>';
    	$i_cpt++;
    }
    Et voici le résultat:
    Memory in use: 1832616 (1.7477188110352M)
    Memory limit: 16M
    
    .
    .
    .
    .
    Memory in use: 1864816 (1.7784271240234M) 
    
    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 1536 bytes) in /....
    Mes calculs sont-ils faux ? Si ce n'est pas le cas, je ne vois pas comment je peux dépasser les 16M vue le résultat du memory_get_usage()

    Peut-être que php n'attribue pas les 16M à mon script, comment puis-je le vérifier ? (sans garbage collector ni memory_get_peak_usage() non disponible en php 5.1 )

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ton résultat n'est pas incohérent : au premier tour de boucle, tu as 1,7 Mo utilisé ; au deuxième tour tu dépasses les 16Mo avant d'avoir atteinds ton echo.
    Il est problable que ta fonction get_login_gest_group() patine dans les choux.

    Au passage utilise une boucle foreach pour parcourir un tableau et non un while ; et la fonction ereg() est obsolète.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 104
    Par défaut
    Ah non justement je ne les dépasses pas (du moins je pense).
    Je n'ai pas mis tous le résultat du code car il est long mais globalement le 'Memory in use' que tu vois avant l'erreur apparaît quasiment en fin de boucle.

    Le résultat un peu plus détaillé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Memory in use: 1832616 (1.7477188110352M)
    Memory limit: 16M
     
    Memory in use: 1834552 (1.7495651245117M)
    Memory in use: 1836352 (1.7512817382812M)
    Memory in use: 1838160 (1.7530059814453M)
    Memory in use: 1838416 (1.7532501220703M)
    Memory in use: 1840288 (1.7550354003906M)
    Memory in use: 1840360 (1.7551040649414M)
    Memory in use: 1840440 (1.7551803588867M)
    Memory in use: 1840520 (1.755256652832M)
    Memory in use: 1840672 (1.7554016113281M)
    Memory in use: 1840848 (1.7555694580078M)
    Memory in use: 1841136 (1.7558441162109M)
    Memory in use: 1841288 (1.755989074707M) 
    .
    .
    .
    Memory in use: 1864744 (1.7783584594727M)
    Memory in use: 1864736 (1.7783508300781M)
    Memory in use: 1864808 (1.7784194946289M)
     
    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 1536 bytes) in /...
    En fait je reste tous le long de la boucle à 1.7Mo mais l'erreur apparaît tout de même ...


    Pour la fonction ereg() elle est obsolète depuis PHP5.3.0 mais le serveur que j'utilise est configuré avec une version 5.1.6

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ma réponse reste valable : tu utilises 1,7Mo jusqu'au x-ième tour de boucle et à la boucle suivante, quelque chose dans ton code ne va plus ; par exemple $id_groupe n'est pas bon et la fonction get_login_gest_group() tombe dans une boucle infinie.

    La fonction ereg est signalée obsolète depuis PHP5.3 ; cela ne la rend pas moins obsolète sur du code écrit actuellement sur un serveur antérieur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 104
    Par défaut
    Bon j'ai retravaillé ma fonction get_login_gest_group() qui était récursive et du coup je n'ai plus le problème.

    J'ai également remplacé la fonction ereg() par mb_ereg().

    Merci pour ton analyse!

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Citation Envoyé par proxichou Voir le message
    J'ai également remplacé la fonction ereg() par mb_ereg().
    Mauvaise pioche. Il faut éviter d'utiliser ereg et dérivés, mais plutôt preg_match à la place.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo