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 :

Générer un gros PDF suite à une requête


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    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 : 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
     
    <?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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Par défaut
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Par défaut
    J'ai exactement le même problème !! Sauf que moi, ce sont des factures à générer tous les mois. Plus de 200 actuellement, avec 2 ou 3 pages chacune, voire 10 parfois. Cela fonctionnait bien en janvier (150 factures, long, mais fonctionne).
    Si je comprends bien la réponse, on pourrait générer les lots par tranches de 50 par exemple, via une tâche CRON, avec un paramètre dans l'url (lot=1, lot=2, etc) qui se déclenche toutes les demi-heures par exemple en début de mois.
    Ce serait cela l'idée ?

  4. #4
    Membre chevronné Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Par défaut
    Bonjour,

    Ce serrai effectivement une solution.
    Mais pas besoin d'en faire appel au cron pour ça, puisque le programme est en "pause" le temps de générer tout les pdf il suffit de faire un appel au second lot une fois le premier fini.

    Sinon est-ce qu'en passant par la commande php -e mapage.php ça ne réglerai pas le problème ?
    Je ne sais pas si l'appel à une page via navigateur et via ligne de commande est identique, à tester.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 82
    Par défaut
    Merci pour ta réponse humitake.
    Tu dis:
    "puisque le programme est en "pause" le temps de générer tout les pdf il suffit de faire un appel au second lot une fois le premier fini."

    Ce n'est pas possible vu le fonctionnement de la classe mpdf qui fait un ob_start et un ob_flush (en gros). Je pense que cela implique un scriptPHP = un fichier PDF en sortie.

    Quant à la ligne de commande que tu indique, je ne la connais pas.

    De toutes façons, je me retrouve avec un autre souci: admettons que je génère 200 fichiers pdf (au lieu d'un seul gros fichier). Il faudra que je les stocke sur le serveur. OK, facile. Mais ensuite, je voudrais les imprimer en un clic. Et là, je ne vois pas comment faire...

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    tu ferais mieux d'utiliser wkhtmltopdf, et en mettant ton HTMl dans un fichier en stream tu ne consommera pas de mémoires

Discussions similaires

  1. [MySQL] Récupérer les variables suite à une requête
    Par naje83 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/04/2007, 16h29
  2. [MySQL] Condition suite à une requête SQL
    Par arnaudperfect dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 26/01/2007, 14h25
  3. Réponses: 5
    Dernier message: 06/01/2007, 04h48
  4. Réponses: 3
    Dernier message: 12/12/2006, 11h45
  5. [JpGraph] Générer un graphique à partir d'une requête
    Par shun dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/01/2006, 19h24

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