quelqu'un connait cette erreur
sachant que en locale sa marche parfaitFatal 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![]()
Discussion :
quelqu'un connait cette erreur
sachant que en locale sa marche parfaitFatal 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![]()
Salut,
hébergeur ?
Je poste à la suite car j'ai aussi une erreur de mémoire :
SpaceFrog m'a conseillé de mettreFatal error: Out of memory (allocated 524288) (tried to allocate 4294967295 bytes) in D:\StoreManager.fr\models\documentManager.class.php on line 404
en haut de mon fichier mais ça ne change rien :s
Code php : Sélectionner tout - Visualiser dans une fenêtre à part ini_set('memory_limit', '512M');
Du coup si vous trouvez une solution je suis preneuse aussi![]()
Salut,
quel est le traitement qui est à l'origine de cette erreur ?
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();
Ok, tu connais la taille du blob que tu essaies de récupérer ?
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é ^^
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é
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 :
On dirait que le ini_set ne fonctionne pasmemory_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![]()
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 ?![]()
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?![]()
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 ?
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.
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.
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 :
Et voici la tant attendue FATAL ERROOOOOOOOOOR :
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");
Je dois aussi préciser que je débute en PHPExcel...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
Merci de votre aide!
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.
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!
Partager