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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Fatal error: Allowed memory size of 16777216 bytes


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut Fatal error: Allowed memory size of 16777216 bytes
    quelqu'un connait cette erreur
    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 7680 bytes) in xxxx/modules/field/modules/field_sql_storage/field_sql_storage.module on line 595
    sachant que en locale sa marche parfait

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    hébergeur ?

  3. #3
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Je poste à la suite car j'ai aussi une erreur de mémoire :
    Fatal error: Out of memory (allocated 524288) (tried to allocate 4294967295 bytes) in D:\StoreManager.fr\models\documentManager.class.php on line 404
    SpaceFrog m'a conseillé de mettre
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('memory_limit', '512M');
    en haut de mon fichier mais ça ne change rien :s

    Du coup si vous trouvez une solution je suis preneuse aussi

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    quel est le traitement qui est à l'origine de cette erreur ?

  5. #5
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Je souhaite lire un fichier qui est en BLOB dans ma Base de données, la lecture se fait dans le fichier suivant :

    Code php : 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
    24
    25
    26
    27
    <?php
    ini_set('memory_limit', '512M');
    include_once(str_replace("\\","/",$_SERVER['DOCUMENT_ROOT'])."/models/classes.inc");
     
    //Ouverture d'une session pour le frame
    //Connexion à la BD spécifique
    $session = new session;
    $session->ouvertureSession($_GET["bdName"].'.frame','frame');
     
    $documentM = new documentManager;
    $result = $documentM->readBlob($_GET["idAttachement"]);
    $type = $result[1];
     
    $mime = "application/octet-stream";
    switch (strtolower($type)){
    	case 'png' : $mime="image/png";
    		      break;
    	case 'gif' : $mime="image/gif";
    		      break;
    	case 'JPEG' : $mime="image/jpeg";
    		      break;
    	case 'pdf' : $mime="application/pdf";
    		      break;
    }
    header("Content-Type: ".$mime);
    fpassthru($result[2]);
    ?>

    Et voici la fonction readBlod :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function readBlob($idAttachement){
    		$sql = "SELECT A.AttachExtension, A.AttachBLOB
    				FROM Attachment AS A
    				WHERE A.AttachID = ".$idAttachement;
    		$instance = Connection::GetInstance($_SESSION['db']['bdname']);
    		$stmt = $instance->prepare($sql);
    		$stmt->execute();
    		$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
    		$stmt->bindColumn(2, $blob, PDO::PARAM_LOB);
    		$result = $stmt->fetch(PDO::FETCH_BOUND);
    		return $result;
    	}

    L'erreur survient au niveau de la ligne d'exécution de la requete sql : stmt->execute();

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Ok, tu connais la taille du blob que tu essaies de récupérer ?

  7. #7
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Non, ça peut varier, ça dépend du BLOB, ils n'ont jamais tous la même taille
    En gros la taille on la connait une fois qu'on a déblobé ^^

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu peux aussi essayer de tracer l'utilisation de la mémoire juste avant l'extraction : memory_get_peak_usage(), histoire de voir ce qui a été consommé

  9. #9
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Alors j'ai ajouté ça un peu partout.

    Voici le fichier qui appelle la fonction de déblob :
    Code php : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
    if(ini_set('memory_limit', '2048M'))
    {
      echo "memory_limit set to 2048MB<br>";
    }
    else
    {
      echo "ini_set() failed!";
    }
    print_r(memory_get_peak_usage());
    echo "<br>";
    include_once(str_replace("\\","/",$_SERVER['DOCUMENT_ROOT'])."/models/classes.inc");
     
    //Ouverture d'une session pour le frame
    //Connexion à la BD spécifique
    $session = new session;
    $session->ouvertureSession($_GET["bdName"].'.frame','frame');
     
    $documentM = new documentManager;
    $result = $documentM->readBlob($_GET["idAttachement"]);
    print_r(memory_get_peak_usage());
    echo "<br>";
    $type = $result[1];
     
    $mime = "application/octet-stream";
    switch (strtolower($type)){
    	case 'png' : $mime="image/png";
    		      break;
    	case 'gif' : $mime="image/gif";
    		      break;
    	case 'JPEG' : $mime="image/jpeg";
    		      break;
    	case 'pdf' : $mime="application/pdf";
    		      break;
    }
    header("Content-Type: ".$mime);
    fpassthru($result[2]);
    ?>

    Voici la fonction de déblob :
    Code php : 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
    public function readBlob($idAttachement){
    		if(ini_set('memory_limit', '2048M'))
    		{
    		  echo "memory_limit set to 2048MB<br>";
    		}
    		else
    		{
    		  echo "ini_set() failed!";
    		}
    		$sql = "SELECT A.AttachExtension, A.AttachBLOB
    				FROM Attachment AS A
    				WHERE A.AttachID = ".$idAttachement;
    		print_r(memory_get_peak_usage());
    		echo "<br>";
    		$instance = Connection::GetInstance($_SESSION['db']['bdname']);
    		$stmt = $instance->prepare($sql);
    		print_r(memory_get_peak_usage());
    		$stmt->execute();
    		$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);
    		$stmt->bindColumn(2, $blob, PDO::PARAM_LOB);
    		$result = $stmt->fetch(PDO::FETCH_BOUND);
    		return $result;
    	}

    Et voici le résultat :
    memory_limit set to 2048MB
    266656
    memory_limit set to 2048MB
    479264
    479264
    ( ! ) Fatal error: Out of memory (allocated 524288) (tried to allocate 4294967295 bytes) in D:\StoreManager.fr\models\documentManager.class.php on line 415
    On dirait que le ini_set ne fonctionne pas

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bah regardes par toi même :
    dans ton erreur : alloué avant l'extraction du blob = 524 Ko (rien à dire), en revanche ; tentative d'allocation : 4 294 967 295 bytes (4 Go). Euh, je vais te surprendre mais je pense qu'il y a un problème

    Allez avoues le : tu a logé toutes les données de ta base dans un seul pauvre champ, c'est ça ?

  11. #11
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Ah oui en effet... Je ne vois pas comment je peux vouloir récupérer 4Go Oo

    Normalement je récupère un pdf, il doit faire dans les 10Mo maximum :o

    Qu'est-ce qui plante alors?

  12. #12
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Pourquoi tu sauvegardes tes pdf en blob ?

    Ensuite si cela fonctionne chez toi en local et que le même script plante lamentablement chez ton hébergeur, il faut se pencher sur les différences de versions entre chez lui et chez toi.
    Bref comparer pas à pas chaque élément y compris leur configuration.

    Quelles sont les version de PHP en dev et en prod ?

  13. #13
    Membre éprouvé
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 151
    Par défaut
    Alors c'est un choix de mes collègues développeurs, choix fait avant que j'arrive et qui donc m'est imposé.
    Qui plus est toutes les bases de données de la majeure partie de nos client sont construites ainsi, avec les documents en BLOB, apparemment ça aurait été pour éviter de se trimballer des fichiers à coté et n'avoir qu'a faire un back de la base de données pour récupérer tout les documents.

    Toujours est-il que maintenant ils veulent un accès web vers ces bases de données et donc un accès à ces fichiers stockés en BLOB.

    La base est sous SQL Server et il me semble que j'ai la même version de Wamp que le serveur distant, à savoir 2.2 avec php v5.3.10 et apache v2.2.21.

    C'est tout de même étrange que la fonction execute de PDO trouve 4Go sur un document en BD. Se pourrait-il qu'elle sauvegarde le contenu de la table en mémoire avant de faire la requête? Mais ça me parait bizarre.

    Edit : Autant pour moi, le serveur est en version php 5.4.3, mais bon, je penses que comme c'est une version supérieure a la mienne, ini_set doit fonctionner.

  14. #14
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Je pense que ton serveur de prod (apache + mysql) est bien plus restrictif dans ce qu'il autorise que celui en dev. Penches toi du côté de leur configuration respectives.

  15. #15
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Par défaut
    Bonjour, je remonte le post car j'ai la même odieuse Fatal Error mais pour un tout autre domaine.

    Pour ma part, je génère un fichier excel à partir d'un tableau multidimensionnel, et j'utilise la librairie PHPExcel. Pour le serveur, c'est Apache avec Xampp.
    A priori c'est une erreur courante, mais dans les diverses explications que j'ai pu trouver, les solutions s'appliquent seulement en lecture de fichier excel, pas en génération.

    Voici mon code :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    $o_rapport_envois = new PHPExcel();
    //Onglet 'Données Agrégées'
        $o_rapport_envois->setActiveSheetIndex(0);
        $o_sheet1 = $o_rapport_envois->getActiveSheet();
      //Mise en page
        $o_sheet1->getColumnDimension('B')->setWidth(42);
        $o_sheet1->getColumnDimension('C')->setWidth(15);
        $o_sheet1->getColumnDimension('D')->setWidth(21);
        $o_sheet1->setCellValue('B2', 'Nom du flux');    
        $o_sheet1->setCellValue('C2', 'Nombre de flux');
        $o_sheet1->setCellValue('D2', 'Nb total de documents');
        $o_sheet1->getStyle('B2:D2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB("ADFF2F");
        $o_sheet1->setCellValue('B3', "TOTAL $v_bp : ");
        $o_sheet1->setCellValue('C3', '=SUM(C4:C40)');
        $o_sheet1->setCellValue('D3', '=SUM(D4:D40)');
        $o_sheet1->getStyle('B3:D3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB("FFFF00");
      //Import de données depuis le tableau
        for($v_row=4; sizeof($t_references); $v_row++){ //fichier excel
            foreach($t_references as $v_nom_flux){
                $o_sheet1->setCellValue('B'.$v_row, "$v_nom_flux"); //Nom du Flux
                $o_sheet1->setCellValue('C'.$v_row, "$v_occurences"); //Nb de flux
                $o_sheet1->setCellValue('D'.$v_row, "$v_total_documents"); //Nb total de documents
            }
        }
        $o_sheet1->setTitle('données agregees');
     
    //Onglet 'Détails'
        $o_sheet2 = $o_rapport_envois->createSheet();
      //Mise en page
        $o_sheet2->getColumnDimension('B')->setWidth(49);
        $o_sheet2->getColumnDimension('C')->setWidth(21);
        $o_sheet2->setCellValue('B2', 'Nom du flux');
        $o_sheet2->setCellValue('C2', 'Nb total de documents');
        $o_sheet2->getStyle('B2:C2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB("ADFF2F");
      //Import de données depuis le tableau
        for($v_row=4; $v_row==$v_taille_tableau; $v_row++){ //fichier excel
            foreach($t_details as $v_nom_complet){
                $o_sheet2->setCellValue('B'.$v_row, "$v_nom_complet"); //Nom du Flux
                $o_sheet2->setCellValue('C'.$v_row, "$v_nb_elements"); //Nb total de documents
            }
        }
        $o_sheet2->setTitle('details');
      //Enregistrement du fichier dans le répertoire de destination
        $o_Writer = PHPExcel_IOFactory::createWriter($o_rapport_envois, 'Excel2007');
        $o_Writer->setOffice2003Compatibility(true);
        $o_Writer->save("D:\\".$v_record.".xls");
    Et voici la tant attendue FATAL ERROOOOOOOOOOR :
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 59 bytes) in D:\xampp\htdocs\PHPExcel\Classes\PHPExcel\Worksheet.php on line 1121
    Je dois aussi préciser que je débute en PHPExcel...

    Merci de votre aide!

  16. #16
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    j'ai eu ça il y a très longtement avec une version de phpexcel. la solution avait été de modifier mon api pour n'utiliser qu'un reader (à l'époque)je n'avais pas besoin d'écrire.

    sinon c'est rarement un probleme qui viens de l'endroit ou l'erreur arrive. C'est souvent une boucle trop longue qui "intègre" trop de mémoire, malheureusement c'est souvent très ch***t à localiser et il faut afficher la pile debug_backtrace() ça peut aider.

  17. #17
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Par défaut
    Arf... pour ma part j'ai vraiment besoin d'écrire dans ce fichier. Et comme je suis en stage, et proche de la fin, je ne peux pas changer de librairie ou de méthode maintenant... DAMNED!

    En tout cas merci, je vais essayer de trouver d'où ça peut venir!

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/12/2009, 14h14
  2. Réponses: 1
    Dernier message: 03/10/2009, 11h36
  3. [PEAR][Mail] Fatal Error : Allowed memory size of 8388608 bytes exhausted
    Par bigben89 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 20/10/2008, 18h01
  4. Réponses: 3
    Dernier message: 08/08/2007, 19h08
  5. [Librairies] zip.lib.php Fatal error: Allowed memory size of 8388608 bytes exhausted
    Par manaboko dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/05/2006, 10h42

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