8b6b232cbc5c99c836b5b3182fcf18d774bb2066
[lhc/web/www.git] / www / plugins-dist / statistiques / public / stats.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 * Loguer une visite
15 *
16 * @plugin Statistiques pour SPIP
17 * @license GNU/GPL
18 * @package SPIP\Stats\Public
19 **/
20
21 if (!defined("_ECRIRE_INC_VERSION")) {
22 return;
23 }
24
25 /**
26 * Logue une visite sur une page
27 *
28 * Enregistre le passage d'un visiteur sur la page demandée
29 * dans `tmp/visites/` qui seront ensuite traitées par une tache cron.
30 *
31 * Ne tient pas compte
32 * - des visites de robots,
33 * - des 404,
34 * - des forum
35 *
36 * @see genie_visites_dist() Pour la tache cron qui traite les logs.
37 *
38 * @param array|null $contexte
39 * Contexte d'appel de la page ; retrouvé automatiquement sinon.
40 * @param string|null $referer
41 * Referer de provenance ; retrouvé automatiquement sinon.
42 * @return null|void
43 **/
44 function public_stats_dist($contexte = null, $referer = null) {
45 if (!is_array($contexte)) {
46 $contexte = $GLOBALS['contexte'];
47 }
48 if (is_null($referer)) {
49 // $_SERVER["HTTP_REFERER"] ne fonctionne pas partout
50 if (isset($_SERVER['HTTP_REFERER'])) {
51 $referer = $_SERVER['HTTP_REFERER'];
52 } else {
53 if (isset($GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"])) {
54 $referer = $GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"];
55 }
56 }
57 }
58
59 // Rejet des robots (qui sont pourtant des humains comme les autres)
60 if (_IS_BOT or (isset($referer) and strpbrk($referer, '<>"\''))) {
61 return;
62 }
63
64 // Ne pas tenir compte des tentatives de spam des forums
65 if ($_SERVER['REQUEST_METHOD'] !== 'GET'
66 or (isset($contexte['page']) and $contexte['page'] == 'forum')
67 ) {
68 return;
69 }
70
71 // rejet des pages 404
72 if (isset($GLOBALS['page']['status'])
73 and $GLOBALS['page']['status'] == 404
74 ) {
75 return;
76 }
77
78 // Identification du client
79 $client_id = substr(md5(
80 $GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')
81 // . $_SERVER['HTTP_ACCEPT'] # HTTP_ACCEPT peut etre present ou non selon que l'on est dans la requete initiale, ou dans les hits associes
82 . (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '')
83 . (isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')
84 ), 0, 10);
85
86 // Analyse du referer
87 $log_referer = '';
88 if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == "oui") {
89 if (isset($referer)) {
90 $url_site_spip = preg_replace(',/$,', '',
91 preg_replace(',^(https?://)?(www\.)?,i', '',
92 url_de_base()));
93 if (!(($url_site_spip <> '')
94 and strpos('-' . strtolower($referer), strtolower($url_site_spip))
95 and strpos($referer, "recherche=") === false)
96 ) {
97 $log_referer = $referer;
98 }
99 }
100 }
101
102 //
103 // stockage sous forme de fichier tmp/visites/client_id
104 //
105
106 // 1. Chercher s'il existe deja une session pour ce numero IP.
107 $content = array();
108 $fichier = sous_repertoire(_DIR_TMP, 'visites') . $client_id;
109 if (lire_fichier($fichier, $content)) {
110 $content = @unserialize($content);
111 }
112 // fichier absent probablement (ou problème unserialize)
113 if (!is_array($content)) {
114 $content = array();
115 }
116
117 // 2. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
118 // et ecrire la session
119 if (count($content) < 200) {
120
121 // Identification de l'element
122 if (isset($contexte['id_article'])) {
123 $log_type = "article";
124 } elseif (isset($contexte['id_breve'])) {
125 $log_type = "breve";
126 } elseif (isset($contexte['id_rubrique'])) {
127 $log_type = "rubrique";
128 } else {
129 $log_type = "";
130 }
131
132 if ($log_type) {
133 $log_type .= "\t" . intval($contexte["id_$log_type"]);
134 } else {
135 $log_type = "autre\t0";
136 }
137
138 $log_type .= "\t" . trim($log_referer);
139 if (isset($content[$log_type])) {
140 $content[$log_type]++;
141 } else {
142 $content[$log_type] = 1;
143 } // bienvenue au club
144
145 ecrire_fichier($fichier, serialize($content));
146 } else {
147 $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
148 @touch($flood);
149 }
150 }