From 26b7be2d2ef6ba434ef7dd530ccd6459b2b43eb0 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Sat, 28 Sep 2002 08:13:54 +0000 Subject: [PATCH] J'essaie de rendre le calcul des referers plus digeste par le serveur : on traite les md5(referers) par lots de 100... Du coup, au lieu de les dater de la veille, on les date du moment du calcul, et on lance le calcul toutes les heures. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A chaque fois qu'un lot de 100 est terminé, la fonction remet un meta qui lancera le calcukl des 100 suivants au prochain hit, jusqu'à épuisement du stock. C'est peut-être un peu overkill, vu que, du coup, ça va moins se remplir... mais on assure comme ça le vidage d'une base qui a des referrs à traiter "ras la gueule". J'espère que le code est bon ;) --- ecrire/inc_statistiques.php3 | 44 ++++++++++++++++++++++++++++-------- inc-stats.php3 | 33 ++++++++++++++++++--------- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/ecrire/inc_statistiques.php3 b/ecrire/inc_statistiques.php3 index 75566a9861..388bfc1d9a 100644 --- a/ecrire/inc_statistiques.php3 +++ b/ecrire/inc_statistiques.php3 @@ -94,12 +94,17 @@ function stats_show_keywords($kw_referer, $kw_referer_host) { // Compiler les statistiques temporaires : visites et referers (si active) // -function calculer_referers($date) { - // Referers sur tout le site +function calculer_100_referers() { + $nombre_de_refs = 100; + $date = date("Y-m-d"); + + // Selectionner 100 referers sur tout le site $query = "SELECT COUNT(DISTINCT ip) AS visites, referer, HEX(referer_md5) AS md5 ". - "FROM spip_referers_temp GROUP BY referer_md5"; + "FROM spip_referers_temp GROUP BY referer_md5 LIMIT 0,$nombre_de_refs"; $result = spip_query($query); + $encore = (mysql_num_rows($result) == $nombre_de_refs); + $referer_insert = ""; $referer_update = ""; @@ -110,6 +115,7 @@ function calculer_referers($date) { $referer_update[$visites][] = $referer_md5; $referer_insert[] = "('$date', '$referer', $referer_md5, $visites)"; + $referer_vus[] = $referer_md5; } // Mise a jour de la base @@ -120,15 +126,17 @@ function calculer_referers($date) { $result = spip_query($query); } } + if (is_array($referer_insert)) { $query_insert = "INSERT DELAYED IGNORE INTO spip_referers ". "(date, referer, referer_md5, visites) VALUES ".join(', ', $referer_insert); $result_insert = spip_query($query_insert); } - // Referers par article + // Ventiler ces referers article par article + $where = (is_array($referer_vus)) ? "AND referer_md5 IN (".join(',',$referer_vus).")" : ""; $query = "SELECT COUNT(DISTINCT ip) AS visites, id_objet, referer, HEX(referer_md5) AS md5 ". - "FROM spip_referers_temp WHERE type='article' GROUP BY id_objet, referer_md5"; + "FROM spip_referers_temp WHERE type='article' $where GROUP BY id_objet, referer_md5"; $result = spip_query($query); $referer_insert = ""; @@ -158,8 +166,26 @@ function calculer_referers($date) { $result_insert = spip_query($query_insert); } - $query_effacer = "DELETE FROM spip_referers_temp"; - $result_effacer = spip_query($query_effacer); + if (is_array($referer_vus)) { + $query_effacer = "DELETE FROM spip_referers_temp WHERE referer_md5 IN (".join(",",$referer_vus).")"; + $result_effacer = spip_query($query_effacer); + } + + // a-t-on atteint le dernier referer ? + return $encore; +} + +function calculer_referers() { + $encore = calculer_100_referers(); + if ($encore) { + include_ecrire("inc_meta.php3"); + ecrire_meta ("calculer_referers_now", "oui"); + ecrire_metas(); + } else { + // un peu de menage + supprimer_referers(); + supprimer_referers("article"); + } } @@ -214,9 +240,9 @@ function calculer_visites($date = "") { } } - if (lire_meta('activer_statistiques_ref') != 'non') { +/* if (lire_meta('activer_statistiques_ref') != 'non') { calculer_referers($date); - } + } */ } diff --git a/inc-stats.php3 b/inc-stats.php3 index 4e1a2df8ac..7bf4efc347 100644 --- a/inc-stats.php3 +++ b/inc-stats.php3 @@ -8,7 +8,6 @@ define("_INC_STATS", "1"); function ecrire_stats() { global $id_article, $id_breve, $id_rubrique, $admin_ok; - $activer_referers = lire_meta('activer_statistiques_ref'); // Essai de fichier de log simplifie $log_ip = $GLOBALS['REMOTE_ADDR']; @@ -29,9 +28,6 @@ function ecrire_stats() { $log_id_num = 0; } - $date = date("Y-m-d"); - $last_date = lire_meta("date_statistiques"); - // Conversion IP 4 octets -> entier 32 bits if (ereg("^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$", $log_ip, $r)) { $log_ip = sprintf("0x%02x%02x%02x%02x", $r[1], $r[2], $r[3], $r[4]); @@ -39,7 +35,19 @@ function ecrire_stats() { else return; // Archivage des visites temporaires - if ($date != $last_date) { + $date = date("Y-m-d"); + $last_date = lire_meta("date_statistiques"); + + if (lire_meta('calculer_referers_now') == 'oui') { + include_ecrire("inc_connect.php3"); + if ($GLOBALS['db_ok']) { + include_ecrire("inc_meta.php3"); + include_ecrire("inc_statistiques.php3"); + ecrire_meta('calculer_referers_now', 'non'); + ecrire_metas(); + calculer_referers(); + } + } else if ($date != $last_date) { include_ecrire("inc_connect.php3"); if ($GLOBALS['db_ok']) { include_ecrire("inc_meta.php3"); @@ -47,6 +55,11 @@ function ecrire_stats() { ecrire_meta("date_statistiques", $date); ecrire_metas(); calculer_visites($last_date); + // poser un message pour le prochain hit + if (lire_meta('activer_statistiques_ref') == 'oui') { + ecrire_meta('calculer_referers_now','oui'); + ecrire_metas(); + } } } @@ -61,7 +74,7 @@ function ecrire_stats() { } // Log complexe (referers) - if ($activer_referers == 'oui') { + if (lire_meta('activer_statistiques_ref') == 'oui') { $url_site_spip = lire_meta('adresse_site'); $url_site_spip = eregi_replace("^(https?|ftp://)www\.", "\\1(www)?\.", $url_site_spip); $log_referer = $GLOBALS['HTTP_REFERER']; @@ -89,17 +102,15 @@ function ecrire_stats() { } - // Effacer les referers + // traiter les referers toutes les heures $date_refs = lire_meta('date_stats_referers'); - if ((time() - $date_refs) > 24 * 3600) { + if ((time() - $date_refs) > 3600) { include_ecrire("inc_connect.php3"); if ($GLOBALS['db_ok']) { include_ecrire("inc_meta.php3"); ecrire_meta("date_stats_referers", time()); + ecrire_meta('calculer_referers_now', 'oui'); ecrire_metas(); - include_ecrire ("inc_statistiques.php3"); - supprimer_referers(); - supprimer_referers("article"); } } -- GitLab