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 :

Gestion de la mémoire [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut Gestion de la mémoire
    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)

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Pas à ma connaissance. A vrai dire php vient seulement de se doter d'un gc en 5.3. Donc une interface pour manipuler le comportement de la mémoire je ne pense pas.


    Par contre je comprend pas bien pourquoi il doit allouée + de 262 143 o (33554432 - 33292289 ).
    Fin je ne suis pas certain de comprendre correctement le message d'erreur car dans
    tried to allocate 33292289 bytes
    Il dit qu'il tente d'allouer (en mémoire totale de process je pense) un peu moins de 32 mo, donc sa devrait passer.

    A moins que sur les 32 mo, il n'y ai quelques octets perdu dans je ne sais quelle informations....

  3. #3
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    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.
    php doit effectuer l'équivalent d'un realloc dans ce cas présent. Les chaînes ne sont pas fragmentées, ce sont des blocs continus en mémoire. Par contre il y a un mecanisme de reference counting qui permet de ne pas dupliquer la mémoire utilisée par deux vars initialisées avec une même source. Aussi, php gère lui même les opérations d'affectation/reaffection de la mémoire pour garantir une restitution de celle-ci quoi qu'il arrive à la fin d'une requête du client.

    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).
    Non. Dans un cas comme celui-ci, qu'adviendrait-il du script dont une variable n'est pas dans un état normal ? php entame sa procédure de "bailout" (exit prématuré de la requête en cours et restitution des ressources qui lui avaient été allouées).

  4. #4
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    bonjour,

    merci pour ces tips.

    donc c'esr résolu ==> on ne peut pas -- dans 5.2 au moins -- modifier simplement la manière dont php effectue sa gestion de la mémoire.

    j'ai effectivement constaté que 5.3 propose un garbage collector qui est au passage activé par défaut
    http://fr3.php.net/manual/en/migrati...w-features.php


    par contre, je suis sous ubuntu et php 5.3 ne serait pas dispo dans les channels habituels (apt-get) avant un moment. Avant ca il faut bricoler et ca me gonfle. donc je testerai ce nouveau garbage collector un peu plus tard

    de toute facon, j'ai fini par trouver l'origine du besoin incongru en mémoire d'un de mes scrips (une erreur d'algo bien sur )

    donc je vais en rester là sur ces histoires de mémoire.

    à noter qd mm, j'ai eu le cas et c'est un peu vicieux
    http://bugs.php.net/bug.php?id=33595

  5. #5
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Ca ne change pas avec php 5.3.
    php 5.2 essaie déjà d'obtimiser sa gestion interne de la mémoire. Le nouveau garbage collector est surtout util pour correctement appréhender les références circulaires (2 objets se référençant mutuellement ne pouvaient pas voir leurs ressources restituées en cours de requête).

    Installe php 5.3 manuellement ?

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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