[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / genie / popularites.php
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
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 //
16 // Popularite, modele logarithmique
17 //
18 function 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
36 function 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 sql_alter("TABLE spip_referers DROP visites_veille,
75 CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
76 ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
77 }
78
79 // et c'est fini pour cette fois-ci
80 return 1;
81
82 }
83
84 ?>