3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 if (!defined('_ECRIRE_INC_VERSION')) {
18 include_spip('inc/statistiques');
19 // moyenne glissante sur 30 jours
20 define('MOYENNE_GLISSANTE_JOUR', 30);
21 // moyenne glissante sur 12 mois
22 define('MOYENNE_GLISSANTE_MOIS', 12);
24 function inc_stats_visites_to_array_dist($unite, $duree, $id_article, $options = array()) {
27 if (!in_array($unite, array('jour', 'mois'))) {
32 $table = "spip_visites";
36 $where[] = sql_date_proche($order, -$duree, 'day', $serveur);
40 $table = "spip_visites_articles";
41 $where[] = "id_article=" . intval($id_article);
44 $where = implode(" AND ", $where);
45 $format = ($unite == 'jour' ?
'%Y-%m-%d' : '%Y-%m-01');
47 $res = sql_select("SUM(visites) AS v, DATE_FORMAT($order,'$format') AS d", $table, $where, "d", "d", "", '',
50 $format = str_replace('%', '', $format);
51 $periode = ($unite == 'jour' ?
24 * 3600 : 365 * 24 * 3600 / 12);
52 $step = intval(round($periode * 1.1, 0));
53 $glisse = constant('MOYENNE_GLISSANTE_' . strtoupper($unite));
56 $r = sql_fetch($res, $serveur);
58 $r = array('d' => date($format, $now), 'v' => 0);
61 $data[$r['d']] = array('visites' => $r['v'], 'moyenne' => moyenne_glissante($r['v'], $glisse));
65 $r = sql_fetch($res, $serveur);
66 // si la derniere n'est pas la date courante, l'ajouter
67 if (!$r and $last != date($format, $now)) {
68 $r = array('d' => date($format, $now), 'v' => 0);
71 // completer les trous manquants si besoin
73 $next = strtotime($last);
74 $current = strtotime($r['d']);
75 while (($next +
= $step) < $current and $d = date($format, $next)) {
76 if (!isset($data[$d])) {
77 $data[$d] = array('visites' => 0, 'moyenne' => moyenne_glissante(0, $glisse));
80 $next = strtotime($last);
85 // projection pour la derniere barre :
87 // + moyenne au pro rata du temps qui reste
88 $moyenne = end($data);
89 $moyenne = prev($data);
90 $moyenne = ($moyenne and isset($moyenne['moyenne'])) ?
$moyenne['moyenne'] : 0;
91 $data[$last]['moyenne'] = $moyenne;
94 $remaining = strtotime(date($format, strtotime(date($format, $now)) +
$step)) - $now;
96 $prorata = $remaining / $periode;
99 $data[$last]['prevision'] = $data[$last]['visites'] +
intval(round($moyenne * $prorata));
101 * Compter les fichiers en attente de depouillement dans tmp/visites/
102 * pour affiner la prediction.
103 * A activer dans le mes_options si l'hebergement tient le coup en cas de gros pics de traffic
105 if (!$id_article and defined('_STATS_COMPTE_EN_ATTENTE') AND _STATS_COMPTE_EN_ATTENTE
){
106 // eviter un depassement memoire en mesurant un echantillon pour commencer
107 $n = count(glob(_DIR_RACINE
. "tmp/visites/0*"));
109 $n = count(glob(_DIR_RACINE
. "tmp/visites/*"));
111 $n +
= count(glob(_DIR_RACINE
. "tmp/visites/4*"));
112 $n +
= count(glob(_DIR_RACINE
. "tmp/visites/8*"));
113 $n +
= count(glob(_DIR_RACINE
. "tmp/visites/c*"));
116 $data[$last]['prevision'] +
= $n;