source: spip-zone/_core_/plugins/statistiques/genie/popularites.php @ 59170

Last change on this file since 59170 was 59170, checked in by cedric@…, 9 years ago

Noter le probleme de http://core.spip.org/issues/2505

File size: 3.4 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15//
16// Popularite, modele logarithmique
17//
18function genie_popularite_constantes($duree){
19        // duree de demi-vie d'une visite dans le calcul de la popularite (en jours)
20        $demivie = 0.5;
21        // periode de reference en jours
22        $periode = 1;
23        // $a est le coefficient d'amortissement depuis la derniere mesure
24        $a = pow(2, - $duree / ($demivie * 24 * 3600));
25        // $b est la constante multiplicative permettant d'avoir
26        // une visite par jour (periode de reference) = un point de popularite
27        // (en regime stationnaire)
28        // or, magie des maths, ca vaut log(2) * duree journee/demi-vie
29        // si la demi-vie n'est pas trop proche de la seconde ;)
30        $b = log(2) * $periode / $demivie;
31
32        return array($a,$b);
33}
34
35// http://doc.spip.org/@genie_popularites_dist
36function genie_popularites_dist($t) {
37
38        // Si c'est le premier appel, ne pas calculer
39        $t = $GLOBALS['meta']['date_popularites'];
40        ecrire_meta('date_popularites', time());
41
42        if (!$t)
43                return 1;
44
45        $duree = time() - $t;
46        list($a,$b) = genie_popularite_constantes($duree);
47
48        // du passe, faisons table (SQL) rase
49        sql_update('spip_articles', array('maj'=>'maj', 'popularite' => "popularite * $a"), 'popularite>1');
50
51        // enregistrer les metas...
52        $row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles");
53        ecrire_meta("popularite_max", $row['max']);
54        ecrire_meta("popularite_total", $row['tot']);
55
56
57        // Une fois par jour purger les referers du jour ; qui deviennent
58        // donc ceux de la veille ; au passage on stocke une date_statistiques
59        // dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron
60        // peut etre appele par deux bases SPIP ne partageant pas le meme
61        // _DIR_TMP, sans tout casser...
62
63        $aujourdhui = date("Y-m-d");
64        if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) {
65                spip_log("Popularite: purger referer depuis $d");
66                ecrire_meta('date_statistiques', $aujourdhui);
67                if (strncmp($GLOBALS['connexions'][0]['type'],'sqlite',6)==0)
68                        spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
69          else
70                        // version 3 fois plus rapide, mais en 2 requetes
71                        #spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
72                        #spip_query("UPDATE spip_referers SET visites_jour=0");
73                        // version 4 fois plus rapide que la premiere, en une seule requete
74                  // ATTENTION : peut poser probleme cf http://core.spip.org/issues/2505
75                        sql_alter("TABLE spip_referers DROP visites_veille,
76                        CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
77                        ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
78        }
79 
80        // et c'est fini pour cette fois-ci
81        return 1;
82
83}
84
85?>
Note: See TracBrowser for help on using the repository browser.