Script trop lent

Script trop lent - PHP - Programmation

Marsh Posté le 17-04-2004 à 19:10:57    

Salut,
 
Comme travail de fin d'année je compte créer une web application permettant aux utilisateurs d'une entreprise d'avoir un historique des pages visitées.
Sachant que le proxy derrière est SQUID il faut que je mettent toutes ces données dans une table mysql pour pouvoir faire des requêtes dessu par la suite.
 
Alors voici mon code :  

Code :
  1. set_time_limit(0);
  2. $timestamp = array();
  3. $user = array();
  4. $url = array();
  5. $i=0;
  6. $handle = file("../log/access.log" ); /* Fichier utilisé */
  7. mysql_connect(MYSQL_ROOT , MYSQL_USER , MYSQL_PASSWORD);
  8. mysql_select_db("access" );
  9. foreach ($handle as $buffer) {
  10. $buffer = str_replace("     " , " " , $buffer); /* Suppression des espaces dans le fichier */
  11. $buffer = str_replace("    ", " " , $buffer);
  12. $buffer = str_replace("   ", " " , $buffer);
  13. $buffer = str_replace("  ", " " , $buffer); /* Fin Suppression */
  14. $data = explode(" " , $buffer);
  15. //$uid = $data[7];
  16. //$sites = $data[6];
  17. //$ipclient = $data[2];
  18. $datevisite = strftime("%Y-%m-%d" , $data[0]); /* date Unix (secondes depuis le 1er Janvier 1970)  vers date compréhensible */
  19. $heurevisite = strftime("%H:%M" , $data[0]);
  20. $urldecomp = parse_url($data[6]); /* Décomposition */
  21. $urldecomp = @$urldecomp['host']; /* de l'url */
  22. include("keywords_rules.php" );
  23. $info = mysql_query("INSERT INTO log VALUES ('' , '$data[7]' , '$datevisite' , '$heurevisite' , '$data[2]', '$urldecomp', '$data[6]' , '$sensible')" );
  24. if ($info) {
  25.  echo "Ligne $i : OK <br />";
  26. } else {
  27.  echo "<strong>Ligne $i : Problème </strong><br />";
  28. };
  29. $i++;
  30. };


 
Le script fonctionne parfaitement mais je trouve sont temps d'exécution trop long alors je fais appel à votre aide pour savoir si il y a pas moyen d'optimiser tout ça.
 
Merci d'avance.

Reply

Marsh Posté le 17-04-2004 à 19:10:57   

Reply

Marsh Posté le 17-04-2004 à 19:12:17    

Voici la structure d'un fichier log SQUID.

Code :
  1. 1079233348.078     32 172.16.14.37 TCP_MISS/304 194 GET http://194.78.90.171/visual/style.mp3 zobu DIRECT/194.78.90.171 -


Message édité par cinezone le 17-04-2004 à 19:12:39
Reply

Marsh Posté le 17-04-2004 à 21:10:28    

déjà cherche d'ou peu venir la surcharge.
affiche le temps de génération régulièrement pour savoir ou est ce que sa rame vraiment.

Reply

Marsh Posté le 17-04-2004 à 21:35:17    

ça doit paraitre con mais comment on affiche le temps ?

Reply

Marsh Posté le 17-04-2004 à 21:50:52    

Code :
  1. $buffer = str_replace("     " , " " , $buffer); /* Suppression des espaces dans le fichier */
  2.      $buffer = str_replace("    ", " " , $buffer);
  3.      $buffer = str_replace("   ", " " , $buffer);
  4.      $buffer = str_replace("  ", " " , $buffer); /* Fin Suppression */
  5.      $data = explode(" " , $buffer);


 
 
regex :o

Reply

Marsh Posté le 18-04-2004 à 11:52:54    

Oué je veux bien le faire en regex mais j'ai jamais rien compris à ce truc même en lisant des tutoriaux.
Tu pourrais pas me donner le code et essayer de l'expliquer stp ? (je sais qu'ici on demande pas de code tout fait mais bon j'ai pas vraiment le choix)

Reply

Marsh Posté le 18-04-2004 à 12:26:47    

Salut
 
le "include("keywords_rules.php" );" tu pourrais pas le mettre en dehors du foreach (il y a quoi dedans ?) ?
 
Sinon effectivement regexp pour traiter le fichier d'entrée

Reply

Marsh Posté le 18-04-2004 à 12:40:45    

au fait keywords_rules.php contient ça
 

Code :
  1. <? if (strstr($data[6] , 'xxx')) { $sensible = 1; } elseif (strstr($data[6] , 'cul')) { $sensible = 1; } elseif (strstr($data[6] , 'anal')) { $sensible = 1; } elseif (strstr($data[6] , 'sex')) { $sensible = 1; } elseif (strstr($data[6] , 'porn')) { $sensible = 1; } elseif (strstr($data[6] , 'clito')) { $sensible = 1; } elseif (strstr($data[6] , 'adult')) { $sensible = 1; } elseif (strstr($data[6] , 'nudity')) { $sensible = 1; } elseif (strstr($data[6] , 'nude')) { $sensible = 1; } elseif (strstr($data[6] , 'hardcore')) { $sensible = 1; } elseif (strstr($data[6] , 'teen')) { $sensible = 1; } elseif (strstr($data[6] , 'gay')) { $sensible = 1; } elseif (strstr($data[6] , 'cum')) { $sensible = 1; } elseif (strstr($data[6] , 'voyeur')) { $sensible = 1; } elseif (strstr($data[6] , 'pussy')) { $sensible = 1; } elseif (strstr($data[6] , 'fuck')) { $sensible = 1; } elseif (strstr($data[6] , 'bondage')) { $sensible = 1; } elseif (strstr($data[6] , 'suck')) { $sensible = 1; } elseif (strstr($data[6] , 'tits')) { $sensible = 1; } elseif (strstr($data[6] , 'naked')) { $sensible = 1; } else { $sensible = 0; }; ?>


 
c'est pour vérifier si un utilisateur a été sur un site de Q en regardant les mots dans l'URL.
A mon avis que ça doit fortement ralentir le script mais je connais pas d'autre moyen pour faire cette vérification (je connais que IF ELSEIF et SWITCH)

Reply

Marsh Posté le 18-04-2004 à 14:23:29    

remplace le include de keywords.php par cette ligne de code et dis moi si ça va plus vite :
 

Code :
  1. $sensible = preg_match("/xxx|cul|anal|sex|porn|clito|adult|nudity|nude|hardcore|teen|gay|cum|voyeur|pussy|fuck|bondage|suck|tits|naked/",$data[6]) ? 1 : 0;

Reply

Marsh Posté le 18-04-2004 à 14:27:39    

Pour voir le temps d'exécution de ton script tu peux utiliser cette fonction :
 

Code :
  1. function getmicrotime() {
  2.     list($usec, $sec) = explode(" ",microtime());
  3.     return ((float)$usec + (float)$sec);
  4. }


 
Ensuite au début de ton script tu fait

Code :
  1. $script_start = getmicrotime();


 
et à la fin tu fais  

Code :
  1. echo sprintf("%.3f",getmicrotime()-$script_start).' secondes';


Message édité par ratibus le 18-04-2004 à 14:30:29
Reply

Marsh Posté le 18-04-2004 à 14:27:39   

Reply

Marsh Posté le 18-04-2004 à 14:46:42    

Merci pour vos réponses. Je testerai tout ça  ce soir, je vous tien au courant.

Reply

Marsh Posté le 18-04-2004 à 17:00:28    

En effet ça va plus vite avec le preg_match();
 
Maitenant je cherche a remplacer

Code :
  1. $buffer = str_replace("     " , " " , $buffer);
  2. $buffer = str_replace("    ", " " , $buffer);
  3. $buffer = str_replace("   ", " " , $buffer);
  4. $buffer = str_replace("  ", " " , $buffer);


en regex avec la fonction preg_replace je crois mais je ne sais pas comment le faire.

Reply

Marsh Posté le 18-04-2004 à 17:29:03    

bah il faut remplacer les \s+ par un " "

Reply

Marsh Posté le 19-04-2004 à 11:21:06    

Voilà mon script avance de plus en plus mais je me pose encore des questions sur la différence entre eregi() et preg_match() qui ont l'air de faire exactement la même chose.

Reply

Marsh Posté le 19-04-2004 à 22:30:41    

preg_match est plus rapide que ereg

Reply

Sujets relatifs:

Leave a Replay

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