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 :

Libérer la mémoire en PHP


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut Libérer la mémoire en PHP
    Bonjour,

    J'ai des scripts monumentaux en terme de consommation de ressources qui doivent tourner sur mon serveur. En réalité, il s'agit d'une suite de script que j'appelle dans un script principale par des requires.

    Le truc, c'est que la mémoire n'est pas libéré entre chaque require, et qu'arrivé a mi chemin, la taille maximum de mémoire allouée est franchie. Je l'augemnterai bien dans le php.ini, mais je suis déjà a 512Mo...

    La question est donc : existe t-il un moyen de supprimer la mémoire alloué, ou de lancer une sorte de garbadge collector (en fait, quelque chose de plus expéditif que unset...) en PHP ?

    en vous remerciant...
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  2. #2
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Bonjour,

    Je me permet d'intervenir, dans le dout, car un require() peut en cacher un autre ^^

    Je suppose que tu a déjà commencé a debuger ton application a l'aide de la fonction memory_get_usage() et que tu a trouvé le fichier critique qui pompe toute la ram. Tu t'es ensuite assuré qu'il n'y a pas de resources qui traine inutilement grace a mysql_free_result() par exemple. Mais tu a toujours ce probleme

    Si oui, alors je ne peu vraiment pas t'aider lool

    -----------
    J'ai quand meme une idée derriere la tete
    Au lieu de faire :
    Code main.php : Sélectionner tout - Visualiser dans une fenêtre à part
    require('Script1.php');
    Essay:
    Code main.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MyRequireScript1{
      function MyRequireScript1(){ // Fonction constructeur
        require('Script1.php');
      }
    }
    // ...
     
    $MyScript1 = new MyRequireScript1();
    //memory_get_usage();
    unset($MyScript1);
    //memory_get_usage();

    L'idée consiste a modifier la porté des variables pour éviter les multiple unset() nécessaires.

    P.S.
    Je n'ai rien vue dans la doc a part unset pour liberrer la mémoire.
    [edit]Il y a pourtant bien des extension percl qui te permettait de gerer la mémoire buffer_creat() etc... Mais je ne pense pas que tu va tout reécrire tout les script...[/edit]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bonjour j'ai a peu près le même problème :

    Je lance un script d'import dans ezpublish grâce à un fichier import.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    require( 'createarchi.php' );
    require( 'createcontent.php' );
    require( 'createlink.php' );
    require( 'createproducttype.php');
    ?>
    Et au bout d'un moment quand il execute le createcontent.php , il me mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 77824 bytes) in /var/www/ezpublish/var/plain_site/cache/trans/g-search-1924056142-utf-8.ctt.php on line 265
    Dans le php.ini : la mémoire allouée est de 256mo donc celà est déjà pas mal.

    Bon mon script d'import est vraiment énorme car il doit créer (pour l'instant 20 000 objets même si à termes il me faudrait créer 100 000 objets)

    Je précise que pour environ 1000 objets le script marche très bien et il mets 20 minutes à s'exécuter donc pour 100 000 objets il mettra entre 20 et 30 heures... donc j'aimerai optimiser au maximum l'opération et notamment au niveau de la mémoire qui sature déjà à la création de 5000 objets.

    Donc gloubi si tu as réussi à avancer sur le problème je suis preneur de solution.

    Merci bien

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bon ben moi je pense passer par un script en shell qui ré appelle le script tout les 2000 objects.

    Car à chaque fois que l'on arrête le script ,il libère la mémoire.

  5. #5
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2006
    Messages : 317
    Points : 597
    Points
    597
    Par défaut
    La question la plus importante :

    Vos objets, il va les chercher ou ? Vous lisez des fichiers ?

    Il y'a des extensions a eviter pour lire des gros fichiers (notamment simplexml) et pour ça, il faut travailler avec des flux. Sinon le fichier est chargé completement dans la memoire pour y etre analysé.

    Fichier (taille du fichier utilise en memoire) -> analyse (ça depend) -> Stockage du resultat (dans un fichier en memoire) = Beaucoup de memoire consommé ^^.

Discussions similaires

  1. [Tableaux] gestion dynamique de la mémoire en PHP
    Par isorn dans le forum Langage
    Réponses: 1
    Dernier message: 02/04/2007, 17h02
  2. Libérer la mémoire en multi-thread
    Par Nathan dans le forum Général Python
    Réponses: 2
    Dernier message: 17/10/2006, 13h36
  3. [Tableaux] Exploitation de la mémoire avec PHP
    Par hackrobat dans le forum Langage
    Réponses: 9
    Dernier message: 24/05/2006, 18h26
  4. Libérer la mémoire allouée à un objet
    Par boudou dans le forum Langage
    Réponses: 6
    Dernier message: 21/02/2006, 23h25
  5. Comment libérer la mémoire d'un TList ?
    Par Tchaill39 dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2005, 18h53

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