source: spip-zone/_core_/plugins/statistiques/public/stats.php @ 92685

Last change on this file since 92685 was 92685, checked in by marcimat@…, 5 years ago

Un peu de phpdoc sur les statistiques encore
(et correction d'un @uses)

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