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

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

Marsh Posté le 08-06-2018 à 10:39:08    

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:

Reply

Marsh Posté le 08-06-2018 à 10:39:08   

Reply

Marsh Posté le 11-06-2018 à 08:24:16    

:bounce:

Reply

Marsh Posté le 11-06-2018 à 10:10:49    

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 ...

Reply

Marsh Posté le 11-06-2018 à 11:27:19    

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:

Reply

Marsh Posté le 11-06-2018 à 13:14:37    

: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.
 
:(

Reply

Marsh Posté le 11-06-2018 à 14:37:03    

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

Reply

Marsh Posté le 11-06-2018 à 14:55:46    

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é!  --
Reply

Marsh Posté le 11-06-2018 à 15:17:09    

: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.

Reply

Marsh Posté le 11-06-2018 à 15:40:54    

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
Reply

Marsh Posté le 11-06-2018 à 18:19:09    

> 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é!  --
Reply

Marsh Posté le 11-06-2018 à 18:19:09   

Reply

Marsh Posté le 12-06-2018 à 09:40:47    

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
Reply

Marsh Posté le 12-06-2018 à 13:41:03    

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é!  --
Reply

Marsh Posté le 12-06-2018 à 13:51:37    

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:

Reply

Marsh Posté le 12-06-2018 à 13:54:35    

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

Reply

Marsh Posté le 13-06-2018 à 16:12:28    

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é!  --
Reply

Marsh Posté le 14-06-2018 à 16:21:57    

: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
Reply

Marsh Posté le 14-06-2018 à 17:10:00    

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:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed