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

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

Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage

File size: 4.2 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")) {
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 **/
44function 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($referer)) {
89                $url_site_spip = preg_replace(',/$,', '',
90                        preg_replace(',^(https?://)?(www\.)?,i', '',
91                                url_de_base()));
92                if (!(($url_site_spip <> '')
93                        AND strpos('-' . strtolower($referer), strtolower($url_site_spip))
94                        AND strpos($referer, "recherche=") === false)
95                ) {
96                        $log_referer = $referer;
97                }
98        }
99
100        //
101        // stockage sous forme de fichier tmp/visites/client_id
102        //
103
104        // 1. Chercher s'il existe deja une session pour ce numero IP.
105        $content = array();
106        $fichier = sous_repertoire(_DIR_TMP, 'visites') . $client_id;
107        if (lire_fichier($fichier, $content)) {
108                $content = @unserialize($content);
109        }
110
111        // 2. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
112        // et ecrire la session
113        if (count($content) < 200) {
114
115                // Identification de l'element
116                if (isset($contexte['id_article'])) {
117                        $log_type = "article";
118                } else {
119                        if (isset($contexte['id_breve'])) {
120                                $log_type = "breve";
121                        } else {
122                                if (isset($contexte['id_rubrique'])) {
123                                        $log_type = "rubrique";
124                                } else {
125                                        $log_type = "";
126                                }
127                        }
128                }
129
130                if ($log_type) {
131                        $log_type .= "\t" . intval($contexte["id_$log_type"]);
132                } else {
133                        $log_type = "autre\t0";
134                }
135
136                $log_type .= "\t" . trim($log_referer);
137                if (isset($content[$log_type])) {
138                        $content[$log_type]++;
139                } else {
140                        $content[$log_type] = 1;
141                } // bienvenue au club
142
143                ecrire_fichier($fichier, serialize($content));
144        } else {
145                $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
146                @touch($flood);
147        }
148}
149
150?>
Note: See TracBrowser for help on using the repository browser.