Performances de FPDF

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Performances de FPDF

Re: Performances de FPDF

par Louisss » 07 juin 2011, 18:29

Sirakawa et Ryle, merci pour vos réponses.

D'abord, pour mettre un peu plus de perplexité dans le problème, je vous évoque un truc dingue :
J'ai testé ma page à la maison (en France) avec une connexion neufbox pas surpuissante, mais acceptable, en tout cas qui me permet de visionner correctement des videos sur youtube. Là, j'ai rencontré le problème que je vous ai évoqué.
De passage à Libreville (Gabon) j'ai tenté le coup d'ouvrir cette fameuse page génératrice du pdf avec une connexion qui n'a jamais permis à son propriétaire de visionner une video en ligne : surprise, le pdf se génère très bien et en un rien de temps... Alors que je n'avais encore fait aucune modification !

Du coup, je me demande si je vais vraiment retoucher mon code. En tout cas, vos remarques et suggestions sont bonnes à prendre, y compris pour n'importe quelle autre page de php, donc merci beaucoup.

Re: Performances de FPDF

par sirakawa » 06 juin 2011, 11:36

Quelques suggestions.
1)
if(strlen
(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 50 OR strlen
(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 10)
gagnerait à:
$texte = utf8_decode(mysql_result($res, $comp, 'un champ d'une table'));
$longueur = strlen($texte);
et à remplacer
par $texte les multiples appels à utf8_decode(mysql_result($res, $comp, 'un champ d'une table'));
par $longueur les multiples appels à strlen (utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))
et un peu partout, à réduire les consultations de la table en créant un tableau ainsi:
$requete = "select * from liste";
$resultat = mysql_query($requete);
$contenu = array();
while ($ligne = mysql_fetch_row($resultat)):
$contenu[] = $ligne;
endwhile;


2)
if (($longueur > 50) OR ($longueur >10)) // si je ne me trompe pas if ($longueur > 10) suffirait

3)
$pdf->SetXY(110, 55); remplacer 110 et compagnie ( $position_anterieureY = $pdf->GetY();) par:
$x = 110;
$y = 55;
$pdf->SetXY($x, $y)
$y += 5;
$pdf->SetXY($x, $y)
On peut prévoir la hauteur des multicells en insérant des sauts de ligne par programme, et en comptant le nombre de lignes à utiliser.
4)
Je ne comprends pas le rôle des
$Designation = str_replace($Mauvaises_lettres, $Bonnes_lettres, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')));
à moins qu'elles soient sous cette forme dans la table.

Un peu désordonné comme réponse, mais que j'espère positive.

M. BIllard

Re: Performances de FPDF

par Ryle » 28 mai 2011, 11:02

A première vue, je dirais que tu peux grandement optimiser ton code en remplaçant ton for() et les mysql_result() par une boucle while et un mysql_fetch_row() (ou à défaut mysql_fetch_assoc(), qui sera beaucoup plus rapide pour récupérer les données de ta base.

Tu dois également pouvoir virer les utf8_decode (ou du moins une bonne partie de ceux-ci). Certains traitement ne sont pas cohérents, par exemple tu fais un utf8_decode(number_format(...)) et tu utilises le résultat qui est une chaine de caractères dans une multiplication, du php doit faire des conversions inutiles de type pour transformer ton nombre en chaine, puis le décoder, puis le retransformer en nombre au lieu de directement faire le produit...

Bref, il y a moyen d'optimiser le code :)

Cependant pour pouvoir comparer les temps de traitement, il faut surtout vérifier que tu as bien les mêmes versions de php/mysql en prod et en dev, vérifier si ton serveur est dédié ou mutualisé, si le serveur appli et bdd sont sur la même machine ou non, s'il n'y a pas un firewall un proxy ou un antivirus qui affectent l'exécution...

Re: Performances de FPDF

par Louisss » 27 mai 2011, 17:34

Merci Maskime pour tes suggestions.

En ce qui concerne le volume de données, le problème ne vient sans doute pas de là car d'un côté comme de l'autre, je suis en phase de test, donc avec des données très légères. Elles sont d'ailleurs même plus légères en ligne qu'en local.
Je penche donc vers ta deuxième suggestion, voici le code d'une page qui génère du pdf :

Code : Tout sélectionner

<?php header('Content-type: text/html; charset=utf-8'); include("inclu/tete_session.php"); include("inclu/connexion.php"); require("fpdf/fpdf.php"); if(isset($_POST['bdc'])) { $req = "requete SQL"; $res = mysql_query($req); $totalHT = 0; $Mauvaises_lettres = array("À", "Á", "Â", "Ã", "Ä", "Å", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü", "Ý", "à", "á", "â", "ã", "ä", "å", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ò", "ó", "ô", "õ", "ö", "ù", "ú", "û", "ü", "ý", "ÿ"); $Bonnes_lettres = array("A", "A", "A", "A", "A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", "O", "O", "O", "O", "O", "U", "U", "U", "U", "Y", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "o", "o", "u", "u", "u", "u", "y", "y"); $pdf = new FPDF("P", "mm", "A4"); $pdf->AddFont("VectoraLH-Roman", "", "VectoraLH-Roman.php"); $pdf->AddFont("VectoraLH-Bold", "", "VectoraLH-Bold.php"); $pdf->AddFont("VectoraLH-BoldItalic", "", "VectoraLH-BoldItalic.php"); $pdf->AddPage(); $pdf->SetMargins(10, 10, 10); $pdf->Image("img/Logo_LFP03.jpg", 80, 10, 50); $pdf->SetXY(10, 55); $pdf->SetFont("VectoraLH-Bold", "", 11); $pdf->Cell(50, 4, utf8_decode("du texte"), 0, 1); $pdf->SetFont("VectoraLH-Roman", "", 11); $pdf->MultiCell(50, 4, utf8_decode("du texte"), 0, 1); $pdf->SetXY(110, 55); $pdf->SetFont("VectoraLH-Bold", "", 14); $pdf->Cell(50, 5, utf8_decode(strtoupper(mysql_result($res, 0, 'un champ d'une table'))), 0, 1); $pdf->SetXY(110, 60); $pdf->SetFont("VectoraLH-Roman", "", 14); $pdf->MultiCell(50, 5, utf8_decode(mysql_result($res, 0, 'un champ d'une table')."\n".mysql_result($res, 0, 'un champ d'une table')."\n".mysql_result($res, 0, 'un champ d'une table')), 0, 1); $pdf->SetXY(15, 95); $pdf->SetFont("VectoraLH-Bold", "", 18); $pdf->Cell(50, 4, utf8_decode("Bon de commande N°".mysql_result($res, 0, 'un champ d'une table')), 0, 1); $pdf->SetXY(120, 105); $pdf->SetFont("VectoraLH-Roman", "", 11); $Tab = explode('-', mysql_result($res, 0, 'un champ d'une table')); $Tabh = explode(':', mysql_result($res, 0, 'un champ d'une table')); $pdf->Cell(50, 4, utf8_decode("Paris, le ".$Tab[2]."/".$Tab[1]."/".$Tab[0]." à ".$Tabh[0].":".$Tabh[1]), 0, 1); $pdf->SetXY(15, 115); $pdf->SetFont("VectoraLH-BoldItalic", "", 10); $pdf->Cell(30, 4, utf8_decode("Référence : "), 0, 0); $pdf->SetFont("VectoraLH-Roman", "", 10); $pdf->Cell(50, 4, utf8_decode(mysql_result($res, 0, 'un champ d'une table')), 0, 1); $pdf->SetXY(15, 120); $pdf->SetFont("VectoraLH-BoldItalic", "", 10); $pdf->Cell(30, 4, utf8_decode("Votre contact : "), 0, 0); $pdf->SetFont("VectoraLH-Roman", "", 10); $pdf->Cell(50, 4, utf8_decode(mysql_result($res, 0, 'un champ d'une table')." ".mysql_result($res, 0, 'un champ d'une table').", Tél. : ".mysql_result($res, 0, 'un champ d'une table').", email : ".mysql_result($res, 0, 'un champ d'une table')), 0, 1); $pdf->SetFont("VectoraLH-Roman", "", 9); $pdf->SetXY(10, 125); $Y = 125; $pdf->Cell(20, 4, utf8_decode("Référence"), 1, 0, "C"); $pdf->Cell(90, 4, utf8_decode("Désignation"), 1, 0, "C"); $pdf->Cell(14, 4, utf8_decode("Quantité"), 1, 0, "C"); $pdf->Cell(9, 4, utf8_decode("Unité"), 1, 0, "C"); $pdf->Cell(19, 4, utf8_decode("Prix unitaire"), 1, 0, "C"); $pdf->Cell(12, 4, utf8_decode("Remise"), 1, 0, "C"); $pdf->Cell(25, 4, utf8_decode("Montant HT"), 1, 1, "C"); for($comp = 0; $comp < mysql_numrows($res); $comp++) { if(strlen(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 50 OR strlen(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 10) { $position_anterieureY = $pdf->GetY(); if(strlen(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 10) { $Reference = str_replace($Mauvaises_lettres, $Bonnes_lettres, utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))); $pdf->MultiCell(20, 4, $Reference, "LR"); if($pdf->GetY() - $position_anterieureY == 4) { $pdf->SetXY(10, $position_anterieureY); if($comp == 0) $pdf->MultiCell(20, 8, $Reference, "TLR", "L", True); else $pdf->MultiCell(20, 8, $Reference, "LR", "L", True); } $pdf->SetXY(30, $position_anterieureY); } else $pdf->Cell(20, 8, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0); if(strlen(utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))) > 50) { $Designation = str_replace($Mauvaises_lettres, $Bonnes_lettres, utf8_decode(mysql_result($res, $comp, 'un champ d'une table'))); $pdf->MultiCell(90, 4, $Designation, "LR"); if($pdf->GetY() - $position_anterieureY == 4) { $pdf->SetXY(30, $position_anterieureY); if($comp == 0) $pdf->MultiCell(90, 8, $Designation, "TLR", "L", True); else $pdf->MultiCell(90, 8, $Designation, "LR", "L", True); } $pdf->SetXY(120, $position_anterieureY); } else $pdf->Cell(90, 8, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0); $pdf->Cell(14, 8, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0, "R"); $pdf->Cell(9, 8, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0, "C"); $pdf->Cell(19, 8, utf8_decode(number_format(mysql_result($res, $comp, 'un champ d'une table'), 0, '', ' ')), "LR", 0, "R"); $pdf->Cell(12, 8, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')." %"), "LR", 0, "R"); $pdf->Cell(25, 8, utf8_decode(number_format((mysql_result($res, $comp, 'un champ d'une table') * mysql_result($res, $comp, 'un champ d'une table') * (1 - mysql_result($res, $comp, 'un champ d'une table')/100)), 0, '', ' ')), "LR", 1, "R"); $Y += 8; } else { $pdf->Cell(20, 4, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0); $pdf->Cell(90, 4, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0); $pdf->Cell(14, 4, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0, "R"); $pdf->Cell(9, 4, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')), "LR", 0, "C"); $pdf->Cell(19, 4, utf8_decode(number_format(mysql_result($res, $comp, 'un champ d'une table'), 0, '', ' ')), "LR", 0, "R"); $pdf->Cell(12, 4, utf8_decode(mysql_result($res, $comp, 'un champ d'une table')." %"), "LR", 0, "R"); $pdf->Cell(25, 4, utf8_decode(number_format((mysql_result($res, $comp, 'un champ d'une table') * mysql_result($res, $comp, 'un champ d'une table') * (1 - mysql_result($res, $comp, 'un champ d'une table')/100)), 0, '', ' ')), "LR", 1, "R"); $Y += 4; } $totalHT += (mysql_result($res, $comp, 'un champ d'une table') * mysql_result($res, $comp, 'un champ d'une table') * (1 - mysql_result($res, $comp, 'un champ d'une table')/100)); } $pdf->Cell(20, 4, "", "LRB", 0); $pdf->Cell(90, 4, "", "LRB", 0); $pdf->Cell(14, 4, "", "LRB", 0); $pdf->Cell(9, 4, "", "LRB", 0); $pdf->Cell(19, 4, "", "LRB", 0); $pdf->Cell(12, 4, "", "LRB", 0); $pdf->Cell(25, 4, "", "LRB", 1); $Y += 4; $pdf->SetFont("VectoraLH-Bold", "", 10); $pdf->SetXY(10, ($Y + 10)); $pdf->Cell(40, 5, utf8_decode("Base HT"), 1, 0, "C"); $pdf->Cell(40, 5, utf8_decode("Taux TVA"), 1, 0, "C"); $pdf->Cell(40, 5, utf8_decode("Montant TVA"), 1, 0, "C"); $pdf->Cell(40, 5, utf8_decode("TOTAL TTC"), 1, 1, "C"); $pdf->SetFont("VectoraLH-Roman", "", 10); $pdf->Cell(40, 5, utf8_decode(number_format($totalHT, 0, '', ' ')." CFA"), 1, 0, "R"); $pdf->Cell(40, 5, utf8_decode(mysql_result($res, 0, 'un champ d'une table')." %"), 1, 0, "R"); $pdf->Cell(40, 5, utf8_decode(number_format(($totalHT * mysql_result($res, 0, 'un champ d'une table') / 100), 0, '', ' ')." CFA"), 1, 0, "R"); $pdf->Cell(40, 5, utf8_decode(number_format(($totalHT + $totalHT * mysql_result($res, 0, 'un champ d'une table') / 100), 0, '', ' ')." CFA"), 1, 1, "R"); $pdf->Output(); exit(); } ?>
Qu'est-ce qui serait mal conçu la dedans ?

Re: Performances de FPDF

par Maskime » 26 mai 2011, 11:31

Hello,

IL faut identifier l'origine de la lenteur.
Mais si je devais parier, je dirais que la grosse différence doit provenir de la taille de la base de données.
Sur ton dev local tu dois avoir des données de tests et pas des données de production.
Si tu peux rapatrier la base de prod sur ton poste, fais le et essaye de relancer la génération pour voir si ça vient pas de ça.

Ensuite pourquoi est ce que tu as une page blanche ? Encore une fois si devais deviner (parce que je n'ai pas plus d'éléments que ça hein ?!) je dirai que ton PHP a trop souffert de la 1ere génération ce qui voudrait dire que ton script manque un peu d'optimisation...

Mais d'aller de l'avant regarde si le temps de génération n'est pas lié au volume de données...

Performances de FPDF

par Louisss » 23 mai 2011, 16:03

Bonjour.

J'ai développé avec FPDF des documents pdf qui sont générés à la volée en puisant dans une base de données MySQL. En local avec MAMP et MacOS X, ça fonctionne très bien. Par contre, lorsque je met mon code en ligne, la génération d'un pdf prend plusieurs minutes la première fois. D'ailleurs, pour que ça puisse aller jusqu'au bout, j'ai dû ajouter un set_time_limit(0).
Et une fois qu'il a été généré, si je referme la page et que je retente de le générer, je n'obtiens rien d'autre qu'une page blanche.

D'où mes questions :
- y-a-t'il quelque chose à faire pour améliorer les performances de génération des mes pages pdf ?
- pourquoi la deuxième génération du pdf ne donne-t-elle rien ?

Merci d'avance