Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/06/2011, 11h38   #1
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
Par défaut Générer un gros PDF suite à une requête

Salut, autre probème qui n'a rien à voir

En me servant de la classe MPDF, je veux générer un pdf qui contiendrais tous les produits qui sont dans ma base de données ( soit 4 000produits).
Le truc c'est que j'arrive toujours à un : Fatal error: Out of memory (allocated 1974206464) (tried to allocate 261904 bytes)

En limitant ma requête avec un LIMIT, ca fonctionne. Je peux aller jusque 1000 produits grâce à :

ini_set("memory_limit",'-1');
ini_set('max_execution_time', 0);

Mon code est tout bête :
Code :
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
 
<?php
 
ini_set("memory_limit",'-1');
ini_set('max_execution_time', 0);
 
 
                $SQL1 = "SELECT nom as nom_prod,parfum as parfum,poids as poids,prix_TTC as prix
FROM  produits
LIMIT 1000
 
";
 
sql_mysql_query ($SQL1, 'nom');
                ?>
                <span style="font-size:6pt">
                <table  class="tableau">
                <tr>
            <th align="left" nowrap>Produit</th>
            <th align="left" nowrap>parfum</th>
                <th align="left" nowrap>poids</th>
                <th align="center" nowrap>prix</th>
                <?php
                while ($row1 = mysql_fetch_object($query_nom)) {
 
                echo '<tr>';
                echo '<td>'; echo $row1->nom_prod; echo '</td>'; echo '<td>'; echo $row1->parfum; echo '</td>'; echo '<td>'; echo $row1->poids; echo '</td>'; echo '<td>';echo $row1->prix;echo '</td>';
                echo '</tr>';
                }
        echo '</table>';
        echo '</span>';
 
 
 
$titre_pdf = 'Produits commandes';
include("../../_modele/html/modele_pdf.php"); // apelle la classe pour générer pdf
?>
Comment dois je m'y prendre ?? J'essaye de générer un catalogue.
Découper en plusieurs script ?? genre le premier limite la requête entre 0 et 1000 puis il appelle le deuxième script qui génère un nouveau PDF de qui limite la requête entre 1000 et 2000 ect..
Ou je sais pas , une idée plus intelligente ??

Là pour 1000 produits , mon pdf fait 22 pages, bon une fois que j'arriverai a faire sortir tous mes produits dedans , je rangerai les données en deux colonnes.

En mode HTML, pas de problème pour afficher tout le catalogue, le problème vient bien de la génération du PDF..

Merci d'avance
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 14h13   #2
Membre habitué
 
Inscription : décembre 2007
Messages : 181
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 181
Points : 140
Points : 140
Salut, l'idée en fait déjà c'est d'analyser l'usage de ta mémoire à chaque passage de la boucle (en debug en tout cas) tu auras donc une idée plus précise de quand passer à un autre fichier.

Ensuite il ne faut pas appeler ton 2eme script via le premier, je suis pas convaincu que ça libère réellement la mémoire.

L'idée c'est de stocker quelques part, l'endroit où tu t'es arreté, via une clé primaire, une date, dans une bdd , dans un fichier peu importe.
De faire tourner un CRON qui appele un script qui traite régulièrement ta base/referentiel, et reprend là ou le précèdent s'est arreté. ainsi la mémoire est vraiment libéré. Et ton script tu lui dis de s'arreter en fonction d'une certaine charge mémoire, ainsi tu optimise le dynamisme jusque dans la charge mémoire.
memory_get_usage() peut, peut-être te servir.
roduce est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h51.


 
 
 
 
Partenaires

Hébergement Web