Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
575 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Optimisation code perl CGI - Problème de performance

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Perl] Optimisation code perl CGI - Problème de performance

n°2316680
web_olivie​r
R1 Powaaaaa
Posté le 08-06-2018 à 10:39:08  profilanswer
 

Bonjour,
 
Je vous explique le context.
 
Je dois requêter une base de données (SQL Server) pour générer un tableau de log.
Lorsque le tableau est "petit", c'est à dire<2000 lignes, mon code fonctionne parfaitement et la page s'affiche rapidement.
 
Par contre quand le nombre de lignes de ma requête SQL est plus important et bien je tombe en time out et ça ne fonctionne plus.
 
Voici mon code :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use LWP::UserAgent;
  5. use CGI;
  6. use DBI;
  7. my $cgi = new CGI;
  8. my $param = $cgi->param('param');
  9. my $data_source = q/dbi:ODBC:localhost/;
  10. my $user = q/sql_admin/;
  11. my $password = q\password\;
  12. # Connect to the data source and get a handle for that connection.
  13. my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;UID=$user;PWD=$password" ) or die "Can't connect to $data_source: $DBI::errstr";
  14. $dbh->{LongReadLen} = 25000;
  15. # Select to get sessionnumber
  16. my $sql="select stagename, stagetype, result, startdatetime, attributexml from [CMA].[sch_CMA].[CMALog] where sessionnumber='$param'";
  17. my $sth= $dbh->prepare($sql);
  18. $sth->execute();
  19. my @tabs;
  20. while (my @row = $sth->fetchrow_array())
  21. {
  22. push (@tabs,@row)
  23. }
  24. my $nb_var=$sth->rows;
  25. $sth->finish();
  26. $dbh->disconnect;
  27. #Création de la page html
  28. my $browser = create_lwp_browser();
  29. my $page="<html>
  30. <head>
  31. <title>CMA Request</title>
  32. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8_decode\"/>
  33. <link rel=\"stylesheet\" type=\"text/css\" href=\"css/cma.css\">
  34. </head>
  35. <body>
  36. <h1>CMA Log GENErator</h1>
  37. ";
  38. print "\n";
  39. $page=$page."
  40. <a href=\"javascript:history.go(-1)\">Retour</a>
  41. <table>
  42. <br>
  43. <caption>$param<caption>
  44. <br>
  45. <tr><th>stagename</th><th>stagetype</th><th>result</th><th>startdatetime</th><th>Value</th></tr>";
  46. my $direction="IN";
  47. my $data;
  48. for (my $j=0; $j<=$nb_var*5-1; $j=$j+5)
  49. {
  50. if (defined $tabs[$j+4])
  51. {
  52.  my @datas=split (/</,$tabs[$j+4]);
  53.  foreach $data(@datas)
  54.  {
  55.   $data=~s/>//g;
  56.   if ($data=~m/parameters/|| $data=~m/inputs/ || $data=~m/outputs/)
  57.   {
  58.    next;
  59.   }
  60.   if ($data=~m/input/)
  61.   {
  62.    $direction="IN";
  63.    $data=~s/input//g;
  64.   }
  65.   if ($data=~m/output/)
  66.   {
  67.    $direction="OUT";
  68.    $data=~s/output//g;
  69.   }
  70.   $data="direction=$direction $data";
  71.   $page=$page."<tr><td>$tabs[$j]</td><td></td><td></td><td></td><td>$data</td></tr>";
  72.  }
  73. }
  74. else
  75. {
  76.  $page=$page."<tr><td>$tabs[$j]</td><td>$tabs[$j+1]</td><td>$tabs[$j+2]</td><td>$tabs[$j+3]</td><td>$tabs[$j+4]</td></tr>";
  77. }
  78. }
  79. $page=$page."
  80. </table>
  81. </body>
  82. </html>";
  83. #Afficher la page html
  84. print $page;
  85. sub create_lwp_browser
  86. {
  87. my $browser = LWP::UserAgent->new;
  88. $browser->env_proxy;
  89. $browser->timeout(30);
  90. $browser->agent('ALoGen.pl/1.0');
  91. return $browser;
  92. }


 
 
Avez vous des pistes pour optimiser ce code ?
J'essaie de réduire le nombre d’itérations de ma boucle for mais sans succès :(
 
Merci pour votre aide.
 
:jap:

mood
Publicité
Posté le 08-06-2018 à 10:39:08  profilanswer
 

n°2316800
web_olivie​r
R1 Powaaaaa
Posté le 11-06-2018 à 08:24:16  profilanswer
 

:bounce:

n°2316804
dede_sav
Posté le 11-06-2018 à 10:10:49  profilanswer
 

Salut,
 
Outre changé de langage pour un truc plus optimisé. Est-ce que tu as regardé si ta requêtes SQL était assez rapide ? (un index nécessaire ?)
Sinon, tu pourrais faire qu'une seul boucle ligne 26 qui, plutôt que tout mettre dans tabs, créerais l'HTML. Tu allongerais le temps de ta connexion à ta base, mais tu gagnerais en perf (tu enlèves un boucle ...)
 
Toutefois, ce prendre un timeout, c'est à dire 2min de traitement pour ca me semble assez étrange, meme pour Perl :p ...

n°2316811
web_olivie​r
R1 Powaaaaa
Posté le 11-06-2018 à 11:27:19  profilanswer
 

Salut,
 
Merci pour ta réponse.
La requête en elle-même est très rapide.
 
Comment vois-tu la modif en ligne 26 ?
 
:jap:

n°2316825
web_olivie​r
R1 Powaaaaa
Posté le 11-06-2018 à 13:14:37  profilanswer
 

:hello:
J'ai supprimé la table @tab et je travaille directement dans @row et donc dans le while de la ligne 26.
J'ai supprime le for, le résultat est le même, sur les résultats<2000 lignes ça fonctionne mais pas pour des résultats plus grands.
 
:(

n°2316826
dede_sav
Posté le 11-06-2018 à 14:37:03  profilanswer
 

C'est quoi un résultat plus grand ?  
On est d'accords que ton timeout est de 2min ?

n°2316827
gilou
Modérateur
Modzilla
Posté le 11-06-2018 à 14:55:46  profilanswer
 

Tu pourrais poster le code mis à jour?
Perso j'aurais fait:  
push (@tabs,\@row)
afin d'éviter la copie de @row dans table a chaque fois et ne pas avoir une immense table @tabs
 
Ça plante toujours à la même ligne, si oui tu connais son numéro d'ordre? Tu as essayé avec des tables distinctes, juste pour savoir si a la base le pb n'est pas avec une ligne particulière (au delà de 2000) de la table.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2316829
web_olivie​r
R1 Powaaaaa
Posté le 11-06-2018 à 15:17:09  profilanswer
 

:hello:
 
Comme le résultat n'était pas plus satisfaisant j'ai supprimé le code mis à jour, je vais le recréer.
Merci pour le push (@tabs,\@row).
 
Oui ça plante toujours à la même ligne, qu'entends-tu par tester avec des tables distinctes ?
 
@dedes_sav, le timeout est bien de 2 minutes et résultat plus grand c'est à dire >2000 lignes.

n°2316832
web_olivie​r
R1 Powaaaaa
Posté le 11-06-2018 à 15:40:54  profilanswer
 

Re,
 
Voici mon code mis a jour:
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use LWP::UserAgent;
  5. use CGI;
  6. use DBI;
  7. my $cgi = new CGI;
  8. my $param = $cgi->param('param');
  9. my $data_source = q/dbi:ODBC:localhost/;
  10. my $user = q/sql_admin/;
  11. my $password = q\password\;
  12. my $direction="IN";
  13. my $data;
  14. #Création de la page html
  15. my $browser = create_lwp_browser();
  16. my $page="<html>
  17. <head>
  18. <title>CMA Request</title>
  19. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8_decode\"/>
  20. <link rel=\"stylesheet\" type=\"text/css\" href=\"css/cma.css\">
  21. </head>
  22. <body>
  23. <h1>CMA Log GENErator</h1>
  24. <a href=\"javascript:history.go(-1)\">Retour</a>
  25. <table class=\"AutomateTable\">
  26. <br>
  27. <caption>$param<caption>
  28. <br>
  29. <tr>
  30. <th>stagename</th><th>stagetype</th><th>result</th><th>startdatetime</th><th>Value</th>
  31. </tr>";
  32. print "\n";
  33. # Connect to the data source and get a handle for that connection.
  34. my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;UID=$user;PWD=$password" ) or die "Can't connect to $data_source: $DBI::errstr";
  35. $dbh->{LongReadLen} = 25000;
  36. # Select to get sessionnumber
  37. my $sql="select stagename, stagetype, result, startdatetime, attributexml from [CMA].[sch_CMA].[CMALog] where sessionnumber='$param'";
  38. my $sth= $dbh->prepare($sql);
  39. $sth->execute();
  40. while (my @row = $sth->fetchrow_array())
  41. {
  42. if (defined $row[4])
  43. {
  44.  my @datas=split (/</,$row[4]);
  45.  foreach $data(@datas)
  46.  {
  47.   $data=~s/>//g;
  48.   if ($data=~m/parameters/|| $data=~m/inputs/ || $data=~m/outputs/)
  49.   {
  50.    next;
  51.   }
  52.   if ($data=~m/input/)
  53.   {
  54.    $direction="IN";
  55.    $data=~s/input//g;
  56.   }
  57.   if ($data=~m/output/)
  58.   {
  59.    $direction="OUT";
  60.    $data=~s/output//g;
  61.   }
  62.   $data="direction=$direction $data";
  63.   $page=$page."<tr><td>$row[0]</td><td></td><td></td><td></td><td>$data</td></tr>
  64.   ";
  65.  }
  66. }
  67. else
  68. {
  69.  $page=$page."<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]</td><td>$row[4]</td></tr>
  70.  ";
  71. }
  72. }
  73. $sth->finish();
  74. $dbh->disconnect;
  75. $page=$page."
  76. </table>
  77. </body>
  78. </html>";
  79. #Afficher la page html
  80. print $page;
  81. sub create_lwp_browser
  82. {
  83. my $browser = LWP::UserAgent->new;
  84. $browser->env_proxy;
  85. $browser->timeout(30);
  86. $browser->agent('ALoGen.pl/1.0');
  87. return $browser;
  88. }


 
:jap:


Message édité par web_olivier le 11-06-2018 à 15:42:11
n°2316836
gilou
Modérateur
Modzilla
Posté le 11-06-2018 à 18:19:09  profilanswer
 

> Oui ça plante toujours à la même ligne, qu'entends-tu par tester avec des tables distinctes ?  
 
Je ne parlais pas de la ligne de code perl, mais de la ligne de la BDD, au cas ou ce soit les données de la BDD qui fassent échouer la requête.
Tu peux pas mettre un compteur pour voir si c'est la même ligne requêtée de la BDD qui échoue toujours ?
my $cpt = 0;
while (my @row = $sth->fetchrow_array())
{
print ++$cpt; # ou print dans un log au vu de ce que fait print dans ton code
 
Si le plantage est systématiquement a la même position, soit une donnée de la BDD fait échouer la requête, soit le nb de requêtes a atteint une limite à modifier. Sinon, ça a plus de chances d'être un vrai pb de timeout réseau
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 11-06-2018 à 18:19:09  profilanswer
 

n°2316866
web_olivie​r
R1 Powaaaaa
Posté le 12-06-2018 à 09:40:47  profilanswer
 

Merci Gilou,
 
Voici ce que j'ai fait :
 

Code :
  1. use strict;
  2. use warnings;
  3. use LWP::UserAgent;
  4. use CGI;
  5. use DBI;
  6. my $cgi = new CGI;
  7. my $param = $cgi->param('param');
  8. my $name = $cgi->param('name');
  9. my $data_source = q/dbi:ODBC:localhost/;
  10. my $user = q/sql_admin/;
  11. my $password = q\password\;
  12. my $direction="IN";
  13. my $data;
  14. #Création de la page html
  15. my $browser = create_lwp_browser();
  16. open (my $fh, '>', "result/$param.html" );
  17. print $fh "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
  18. <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
  19. \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
  20. <HTML xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
  21. <HEAD>
  22.  <TITLE>Complete Session Log for processus $param</TITLE>
  23.  <STYLE>
  24.   BODY{font-family: helvetica;}
  25.   TABLE.AutomateTable {width: 100%;border: 1;empty-cells: show;border-collapse: collapse;font-size: 8pt;}
  26.   TD, TH {border: 1px solid #9fa4c1;padding-left: 3px;padding-right: 1px;padding-top: 1px;padding-bottom: 1px;vertical-align: top;}
  27.   TH {font-weight: bold; color: white;background-color: #9fa4c1;}
  28.  </STYLE>
  29. </HEAD>
  30. <body>
  31. <h1>CMA Log GENErator</h1>
  32. <table class=\"AutomateTable\">
  33. <br>
  34. <caption>$param<caption>
  35. <br>
  36. <tr>
  37. <th>stagename</th><th>result</th><th>startdatetime</th><th>Value</th>
  38. </tr>";
  39. print "\n";
  40. # Connect to the data source and get a handle for that connection.
  41. my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;UID=$user;PWD=$password" ) or die "Can't connect to $data_source: $DBI::errstr";
  42. $dbh->{LongReadLen} = 25000;
  43. # Select to get sessionnumber
  44. my $sql="select stagename, result, startdatetime, attributexml from [CMA].[sch_CMA].[CMALog] where sessionnumber='$param'";
  45. my $sth= $dbh->prepare($sql);
  46. $sth->execute();
  47. while (my @row = $sth->fetchrow_array())
  48. {
  49. if (defined $row[3])
  50. {
  51.  my @datas=split (/</,$row[3]);
  52.  foreach $data(@datas)
  53.  {
  54.   $data=~s/>//g;
  55.   if ($data=~m/parameters/|| $data=~m/inputs/ || $data=~m/outputs/)
  56.   {
  57.    next;
  58.   }
  59.   if ($data=~m/input/)
  60.   {
  61.    $direction="IN";
  62.    $data=~s/input//g;
  63.   }
  64.   if ($data=~m/output/)
  65.   {
  66.    $direction="OUT";
  67.    $data=~s/output//g;
  68.   }
  69.   $data="direction=$direction $data";
  70.   print $fh "<tr><td>$row[0]</td><td></td><td></td><td>$data</td></tr>
  71.   ";
  72.  }
  73. }
  74. else
  75. {
  76.  print $fh "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]</td></tr>
  77.  ";
  78. }
  79. }
  80. $sth->finish();
  81. $dbh->disconnect;
  82. print $fh "
  83. </table>
  84. </body>
  85. </html>";
  86. close $fh;
  87. #Création de la page html
  88. my $browser = create_lwp_browser();
  89. my $page="<html>
  90. <head>
  91. <title>CMA Request</title>
  92. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8_decode\"/>
  93. <link rel=\"stylesheet\" type=\"text/css\" href=\"css/cma.css\">
  94. </head>
  95. <body>
  96. <h1>CMA Log GENErator</h1>
  97.  <br>
  98.  <br>
  99.  <a href=\"result/$param.html\" download=\"result/$param.html\">Telecharger le fichier de log pour le process <b>$name</b> (process #$param)</a>
  100.  <br><br>
  101.  <a href=\"javascript:history.go(-1)\">Retour</a>
  102. </body>
  103. </html>";
  104. print $page;
  105. sub create_lwp_browser
  106. {
  107. my $browser = LWP::UserAgent->new;
  108. $browser->env_proxy;
  109. $browser->timeout(30);
  110. $browser->agent('ALoGen.pl/1.0');
  111. return $browser;
  112. }


 
J'écris ma page dans un fichier (dans /result/$param.html) ensuite j'affiche une page qui propose un liens vers le fichier généré pour le télécharger.
Résultat, si je génère mon fichier sur une petite log, pas de problème, le fichier est généré et le lien de téléchargement fonctionne très bien.
Si je génère mon fichier sur une grosse log, alors le fichier est bien généré dans /result/$param.html, il est complet, mais ma page avec le lien de téléchargement ne s'affiche jamais et je termine de nouveau en timeout  :pt1cable:  
 
Le problème est donc ailleurs ? une idée à la vu du code ?
 
:jap:


Message édité par web_olivier le 12-06-2018 à 14:08:30
n°2316882
gilou
Modérateur
Modzilla
Posté le 12-06-2018 à 13:41:03  profilanswer
 

Euh, et si tu testes avec une boucle a vide, et aucun autre code parasite, ça plante aussi?
while (my @row = $sth->fetchrow_array()) {}
 
> Si je génère mon fichier sur une grosse log, alors le fichier est bien généré dans /result/$param.html, il est complet, mais ma page avec le lien de téléchargement ne s'affiche jamais et je termine de nouveau en timeout
 
Donc en fait le pb n'a rien a voir avec la BDD, c'est ton chargement de la page html générée qui échoue, c'est bien ça?
 
A+,


Message édité par gilou le 12-06-2018 à 13:44:49

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2316883
web_olivie​r
R1 Powaaaaa
Posté le 12-06-2018 à 13:51:37  profilanswer
 

Merci Gilou, oui c'est bien ça :(
Pourtant j'ai d'autre pages sur le même model qui fonctionnent parfaitement, et cette même page fonctionne si le résultat de la requête SQL, donc le fichier généré, n'est pas trop grand !
 
je vais tester le while à vide.
 
:jap:

n°2316884
web_olivie​r
R1 Powaaaaa
Posté le 12-06-2018 à 13:54:35  profilanswer
 

Je viens de tester avec la boucle à vide et ça fonctionne dans tous les cas :(

n°2316930
gilou
Modérateur
Modzilla
Posté le 13-06-2018 à 16:12:28  profilanswer
 

Le problème est donc dans cette partie, et tout à fait en dehors du code DBI :

Code :
  1. #Création de la page html
  2. my $browser = create_lwp_browser();
  3. my $page="<html>
  4. <head>
  5. <title>CMA Request</title>
  6. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8_decode\"/>
  7. <link rel=\"stylesheet\" type=\"text/css\" href=\"css/cma.css\">
  8. </head>
  9. <body>
  10. <h1>CMA Log GENErator</h1>
  11. <br>
  12. <br>
  13. <a href=\"result/$param.html\" download=\"result/$param.html\">Telecharger le fichier de log pour le process <b>$name</b> (process #$param)</a>
  14. <br><br>
  15. <a href=\"javascript:history.go(-1)\">Retour</a>
  16. </body>
  17. </html>";
  18. print $page;
  19. sub create_lwp_browser
  20. {
  21. my $browser = LWP::UserAgent->new;
  22. $browser->env_proxy;
  23. $browser->timeout(30);
  24. $browser->agent('ALoGen.pl/1.0');
  25. return $browser;
  26. }


Tu as essayé en augmentant le timeout?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2316967
web_olivie​r
R1 Powaaaaa
Posté le 14-06-2018 à 16:21:57  profilanswer
 

:hello:
 
Oui j'ai augmenté le timeout sans plus de succès.
 
Je ne pense pas que le problème vienne de la partie que tu cite car elle fonctionne parfaitement quand le résultat de la requête est petit.
 
J'ai encore modifié le code pour limiter les IO, je mets tout dans une variable et j'écris le fichier d'un coup.
 

Code :
  1. use strict;
  2. use warnings;
  3. use LWP::UserAgent;
  4. use CGI;
  5. use DBI;
  6. my $cgi = new CGI;
  7. my $param = $cgi->param('param');
  8. my $name = $cgi->param('name');
  9. my $data_source = q/dbi:ODBC:localhost/;
  10. my $user = q/sql_admin/;
  11. my $password = q\password\;
  12. my $direction="IN";
  13. my $data;
  14. my $result="<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
  15. <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
  16. \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
  17. <HTML xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
  18. <HEAD>
  19.  <TITLE>Complete Session Log for Dossier - Process - Reporting</TITLE>
  20.  <STYLE>
  21.   BODY{font-family: helvetica;}
  22.   TABLE.AutomateTable {width: 100%;border: 1;empty-cells: show;border-collapse: collapse;font-size: 8pt;}
  23.   TD, TH {border: 1px solid #9fa4c1;padding-left: 3px;padding-right: 1px;padding-top: 1px;padding-bottom: 1px;vertical-align: top;}
  24.   TH {font-weight: bold; color: white;background-color: #9fa4c1;}
  25.  </STYLE>
  26. </HEAD>
  27. <body>
  28.  <h1>CMA Log GENErator</h1>
  29.  <table class=\"AutomateTable\">
  30.  <br>
  31.  <caption>$param - $name<caption>
  32.  <br>
  33.  <tr>
  34.  <th>stagename</th><th>result</th><th>startdatetime</th><th>Value</th>
  35.  </tr>";
  36. print "\n";
  37. # Connect to the data source and get a handle for that connection.
  38. my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=localhost;UID=$user;PWD=$password" ) or die "Can't connect to $data_source: $DBI::errstr";
  39. $dbh->{LongReadLen} = 25000;
  40. # Select to get sessionnumber
  41. my $sql="select stagename, result, startdatetime, attributexml from [CMA].[sch_CMA].[CMALog] where sessionnumber='$param'";
  42. my $sth= $dbh->prepare_cached($sql);
  43. $sth->execute();
  44. my($stagename, $res, $startdatetime, $Value);
  45. $sth->bind_columns(undef, \$stagename, \$res, \$startdatetime, \$Value);
  46. while ($sth->fetch)
  47. {
  48. if (defined $Value)
  49. {
  50.  my @datas=split (/</,$Value);
  51.  foreach $data(@datas)
  52.  {
  53.   $data=~s/>//g;
  54.   if ($data=~m/parameters/|| $data=~m/inputs/ || $data=~m/outputs/)
  55.   {
  56.    next;
  57.   }
  58.   if ($data=~m/input/)
  59.   {
  60.    $direction="IN";
  61.    $data=~s/input//g;
  62.   }
  63.   if ($data=~m/output/)
  64.   {
  65.    $direction="OUT";
  66.    $data=~s/output//g;
  67.   }
  68.   $data="direction=$direction $data";
  69.   $result=$result."<tr><td>$stagename</td><td></td><td></td><td>$data</td></tr>
  70.   ";
  71.  }
  72. }
  73. else
  74. {
  75.  $result=$result."<tr><td>$stagename</td><td>$res</td><td>$startdatetime</td><td>$Value</td></tr>
  76.  ";
  77. }
  78. }
  79. $result=$result."</table>
  80. </body>
  81. </html>";
  82. $sth->finish();
  83. $dbh->disconnect;
  84. open (my $fh, '>', "result/$param.html" );
  85. print $fh $result;
  86. close $fh;
  87. #Création de la page html
  88. my $browser = create_lwp_browser();
  89. my $page="<html>
  90. <head>
  91. <title>CMA Request</title>
  92. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8_decode\"/>
  93. <link rel=\"stylesheet\" type=\"text/css\" href=\"css/CMA.css\">
  94. </head>
  95. <body>
  96.  <h1>CMA Log GENErator</h1>
  97.  <br>
  98.  <br>
  99.  <a href=\"result/$param.html\" download=\"result/$param.html\">Telecharger le fichier de log pour le process <b>$name</b> (process #$param)</a>
  100.  <br><br>
  101.  <a href=\"javascript:history.go(-1)\">Retour</a>
  102. </body>
  103. </html>";
  104. print $page;
  105. sub create_lwp_browser
  106. {
  107. my $browser = LWP::UserAgent->new;
  108. $browser->env_proxy;
  109. $browser->timeout(300);
  110. $browser->agent('ALoGen.pl/1.0');
  111. return $browser;
  112. }


 
Je suis allé plus loin dans mes tests, si je mets en commentaire le else dans le if du while alors ça fonctionne :

Code :
  1. while ($sth->fetch)
  2. {
  3. if (defined $Value)
  4. {
  5.  my @datas=split (/</,$Value);
  6.  foreach $data(@datas)
  7.  {
  8.   $data=~s/>//g;
  9.   if ($data=~m/parameters/|| $data=~m/inputs/ || $data=~m/outputs/)
  10.   {
  11.    next;
  12.   }
  13.   if ($data=~m/input/)
  14.   {
  15.    $direction="IN";
  16.    $data=~s/input//g;
  17.   }
  18.   if ($data=~m/output/)
  19.   {
  20.    $direction="OUT";
  21.    $data=~s/output//g;
  22.   }
  23.   $data="direction=$direction $data";
  24.   $result=$result."<tr><td>$stagename</td><td></td><td></td><td>$data</td></tr>
  25.   ";
  26.  }
  27. }
  28. #else
  29. #{
  30. # $result=$result."<tr><td>$stagename</td><td>$res</td><td>$startdatetime</td><td>$Value</td></tr>
  31. # ";
  32. #}
  33. }


 
C'est donc la ligne

Code :
  1. $result=$result."<tr><td>$stagename</td><td>$res</td><td>$startdatetime</td><td>$Value</td></tr>

qui pose problème.
 
Dans les logs de mon serveur Web je vois pourtant que la page renvoie un code 200 même quand je tombe en timeout :(


Message édité par web_olivier le 15-06-2018 à 10:16:46
n°2316978
web_olivie​r
R1 Powaaaaa
Posté le 14-06-2018 à 17:10:00  profilanswer
 

J'ai trouver la solution :)
 
C'est la variable $res qui posait problème quand elle est vide.
 
J'ai donc ajouté ce contrôle dans le else:

Code :
  1. else
  2. {
  3.  if (!defined $res)
  4.  {
  5.   $res="";
  6.  }
  7.  $result=$result."<tr><td>$stagename</td><td>$res</td><td>$startdatetime</td><td></td></tr>
  8.  ";
  9. }


 
 :bounce:  :bounce:  :bounce:  
 
On peut peut-être faire plus propre ?
 
 :hello:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Optimisation code perl CGI - Problème de performance

 

Sujets relatifs
Problème wordpress elementorCode jeux du nombre aléatoire en python 3.6
[VBS] Problème déplacement fichierProbleme signature html
Problème de redirectionBouton skype (code javascript) pas reconnu dans html du site Jimdo
Probleme de PHP Formulaire de contactProblème avec number_format()
Performance de ma table[Perl] Détecter un champ en UTF-8
Plus de sujets relatifs à : [Perl] Optimisation code perl CGI - Problème de performance


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR