3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2020 *
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 \***************************************************************************/
16 * @plugin Statistiques pour SPIP
18 * @package SPIP\Stats\Public
21 if (!defined("_ECRIRE_INC_VERSION")) {
26 * Logue une visite sur une page
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.
32 * - des visites de robots,
36 * @see genie_visites_dist() Pour la tache cron qui traite les logs.
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.
44 function public_stats_dist($contexte = null, $referer = null) {
45 if (!is_array($contexte)) {
46 $contexte = $GLOBALS['contexte'];
48 if (is_null($referer)) {
49 // $_SERVER["HTTP_REFERER"] ne fonctionne pas partout
50 if (isset($_SERVER['HTTP_REFERER'])) {
51 $referer = $_SERVER['HTTP_REFERER'];
53 if (isset($GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"])) {
54 $referer = $GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"];
59 // Rejet des robots (qui sont pourtant des humains comme les autres)
60 if (_IS_BOT
or (isset($referer) and strpbrk($referer, '<>"\''))) {
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')
71 // rejet des pages 404
72 if (isset($GLOBALS['page']['status'])
73 and $GLOBALS['page']['status'] == 404
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'] : '')
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', '',
93 if (!(($url_site_spip <> '')
94 and strpos('-' . strtolower($referer), strtolower($url_site_spip))
95 and strpos($referer, "recherche=") === false)
97 $log_referer = $referer;
103 // stockage sous forme de fichier tmp/visites/client_id
106 // 1. Chercher s'il existe deja une session pour ce numero IP.
108 $fichier = sous_repertoire(_DIR_TMP
, 'visites') . $client_id;
109 if (lire_fichier($fichier, $content)) {
110 $content = @unserialize
($content);
112 // fichier absent probablement (ou problème unserialize)
113 if (!is_array($content)) {
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) {
121 // Identification de l'element
122 if (isset($contexte['id_article'])) {
123 $log_type = "article";
124 } elseif (isset($contexte['id_breve'])) {
126 } elseif (isset($contexte['id_rubrique'])) {
127 $log_type = "rubrique";
133 $log_type .= "\t" . intval($contexte["id_$log_type"]);
135 $log_type = "autre\t0";
138 $log_type .= "\t" . trim($log_referer);
139 if (isset($content[$log_type])) {
140 $content[$log_type]++
;
142 $content[$log_type] = 1;
143 } // bienvenue au club
145 ecrire_fichier($fichier, serialize($content));
147 $flood = sous_repertoire(_DIR_TMP
, 'flood') . $GLOBALS['ip'];