4 |
david |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
/***************************************************************************\
|
|
|
4 |
* SPIP, Systeme de publication pour l'internet *
|
|
|
5 |
* *
|
|
|
6 |
* Copyright (c) 2001-2005 *
|
|
|
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 |
// Ce fichier ne sera execute qu'une fois
|
|
|
15 |
if (defined("_ECRIRE_INC_POPULARITES")) return;
|
|
|
16 |
define("_ECRIRE_INC_POPULARITES", "1");
|
|
|
17 |
|
|
|
18 |
//
|
|
|
19 |
// Popularite, modele logarithmique
|
|
|
20 |
//
|
|
|
21 |
|
|
|
22 |
function calculer_popularites($t) {
|
|
|
23 |
|
|
|
24 |
$duree = time() - $t;
|
|
|
25 |
// duree de demi-vie d'une visite dans le calcul de la popularite (en jours)
|
|
|
26 |
$demivie = 1;
|
|
|
27 |
// periode de reference en jours
|
|
|
28 |
$periode = 1;
|
|
|
29 |
// $a est le coefficient d'amortissement depuis la derniere mesure
|
|
|
30 |
$a = pow(2, - $duree / ($demivie * 24 * 3600));
|
|
|
31 |
// $b est la constante multiplicative permettant d'avoir
|
|
|
32 |
// une visite par jour (periode de reference) = un point de popularite
|
|
|
33 |
// (en regime stationnaire)
|
|
|
34 |
// or, magie des maths, ca vaut log(2) * duree journee/demi-vie
|
|
|
35 |
// si la demi-vie n'est pas trop proche de la seconde ;)
|
|
|
36 |
$b = log(2) * $periode / $demivie;
|
|
|
37 |
|
|
|
38 |
// oublier un peu le passe
|
|
|
39 |
spip_query("UPDATE spip_articles SET maj=maj, popularite = popularite * $a");
|
|
|
40 |
|
|
|
41 |
// ajouter les points visites
|
|
|
42 |
$count_article = Array();
|
|
|
43 |
$query = "SELECT COUNT(*) as count,id_objet FROM spip_visites_temp WHERE maj > DATE_SUB(NOW(), INTERVAL $duree SECOND) AND type='article' GROUP BY id_objet";
|
|
|
44 |
$res = spip_query($query);
|
|
|
45 |
while ($row = @spip_fetch_array($res)) {
|
|
|
46 |
$count_article[$row['count']] .= ','.$row['id_objet']; // l'objet a count visites
|
|
|
47 |
}
|
|
|
48 |
|
|
|
49 |
foreach($count_article as $count => $articles) {
|
|
|
50 |
$query = "UPDATE spip_articles
|
|
|
51 |
SET maj=maj, popularite = GREATEST(1,popularite) + $b * $count
|
|
|
52 |
WHERE id_article IN (0$articles)";
|
|
|
53 |
spip_query($query);
|
|
|
54 |
}
|
|
|
55 |
|
|
|
56 |
// ajouter les points referers
|
|
|
57 |
$count_article = Array();
|
|
|
58 |
$query = "SELECT COUNT(*) as count,id_objet FROM spip_referers_temp WHERE maj > DATE_SUB(NOW(), INTERVAL $duree SECOND) AND type='article' GROUP BY id_objet";
|
|
|
59 |
$res = spip_query($query);
|
|
|
60 |
while ($row = @spip_fetch_array($res)) {
|
|
|
61 |
$count_article[$row['count']] .= ','.$row['id_objet']; // l'objet a count referers
|
|
|
62 |
}
|
|
|
63 |
|
|
|
64 |
foreach($count_article as $count => $articles) {
|
|
|
65 |
$query = "UPDATE spip_articles
|
|
|
66 |
SET maj=maj, popularite = GREATEST(1,popularite) + $b * $count
|
|
|
67 |
WHERE id_article IN (0$articles)";
|
|
|
68 |
spip_query($query);
|
|
|
69 |
}
|
|
|
70 |
|
|
|
71 |
// et enregistrer les metas...
|
|
|
72 |
list($maxpop, $totalpop) = spip_fetch_array(spip_query("SELECT MAX(popularite), SUM(popularite) FROM spip_articles"));
|
|
|
73 |
ecrire_meta("popularite_max", $maxpop);
|
|
|
74 |
ecrire_meta("popularite_total", $totalpop);
|
|
|
75 |
ecrire_metas();
|
|
|
76 |
}
|
|
|
77 |
?>
|