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

Last change on this file since 92685 was 92685, checked in by marcimat@…, 5 years ago

Un peu de phpdoc sur les statistiques encore
(et correction d'un @uses)

File size: 4.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2014                                                *
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
13/**
14 * Gestion du calcul des popularités (cron)
15 *
16 * @plugin Statistiques pour SPIP
17 * @license GNU/GPL
18 * @package SPIP\Statistiques\Genie
19**/
20
21if (!defined("_ECRIRE_INC_VERSION")) return;
22
23
24/**
25 * Calcule des coefficients de popularité en fonction de l'intervalle
26 * écoulé depuis le précédent calcul
27 *
28 * Popularite, modele logarithmique
29 *
30 * @param int $duree Intervalle écoulé depuis le précédent calcul
31 * @return array {
32 *     @type float $a Coefficient d'amortissement
33 *     @type float $b Constante multiplicative
34 * }
35**/
36function genie_popularite_constantes($duree){
37        // duree de demi-vie d'une visite dans le calcul de la popularite (en jours)
38        $demivie = 0.5;
39        // periode de reference en jours
40        $periode = 1;
41        // $a est le coefficient d'amortissement depuis la derniere mesure
42        $a = pow(2, - $duree / ($demivie * 24 * 3600));
43        // $b est la constante multiplicative permettant d'avoir
44        // une visite par jour (periode de reference) = un point de popularite
45        // (en regime stationnaire)
46        // or, magie des maths, ca vaut log(2) * duree journee/demi-vie
47        // si la demi-vie n'est pas trop proche de la seconde ;)
48        $b = log(2) * $periode / $demivie;
49
50        return array($a,$b);
51}
52
53/**
54 * Cron de calcul des popularités des articles
55 *
56 * @uses genie_popularite_constantes()
57 *
58 * @param int $t
59 *     Timestamp de la dernière exécution de cette tâche
60 * @return int
61 *     Positif si la tâche a été terminée, négatif pour réexécuter cette tâche
62**/
63function genie_popularites_dist($t) {
64
65        // Si c'est le premier appel, ne pas calculer
66        $t = $GLOBALS['meta']['date_popularites'];
67        ecrire_meta('date_popularites', time());
68
69        if (!$t)
70                return 1;
71
72        $duree = time() - $t;
73        list($a,$b) = genie_popularite_constantes($duree);
74
75        // du passe, faisons table (SQL) rase
76        sql_update('spip_articles', array('maj'=>'maj', 'popularite' => "popularite * $a"), 'popularite>1');
77
78        // enregistrer les metas...
79        $row = sql_fetsel('MAX(popularite) AS max, SUM(popularite) AS tot', "spip_articles");
80        ecrire_meta("popularite_max", $row['max']);
81        ecrire_meta("popularite_total", $row['tot']);
82
83
84        // Une fois par jour purger les referers du jour ; qui deviennent
85        // donc ceux de la veille ; au passage on stocke une date_statistiques
86        // dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron
87        // peut etre appele par deux bases SPIP ne partageant pas le meme
88        // _DIR_TMP, sans tout casser...
89
90        $aujourdhui = date("Y-m-d");
91        if (($d = $GLOBALS['meta']['date_statistiques']) != $aujourdhui) {
92                spip_log("Popularite: purger referer depuis $d");
93                ecrire_meta('date_statistiques', $aujourdhui);
94                if (strncmp($GLOBALS['connexions'][0]['type'],'sqlite',6)==0)
95                        spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
96          else
97                        // version 3 fois plus rapide, mais en 2 requetes
98                        #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'");
99                        #spip_query("UPDATE spip_referers SET visites_jour=0");
100                        // version 4 fois plus rapide que la premiere, en une seule requete
101                  // ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
102                        sql_alter("TABLE spip_referers DROP visites_veille,
103                        CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
104                        ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
105        }
106 
107        // et c'est fini pour cette fois-ci
108        return 1;
109
110}
111
112?>
Note: See TracBrowser for help on using the repository browser.