Skip to content
Extraits de code Groupes Projets
inc-stats.php3 3,17 ko
Newer Older
<?php
Yannick Patois's avatar
Yannick Patois a validé

Fil's avatar
Fil a validé
/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
Fil's avatar
Fil a validé
 *  Copyright (c) 2001-2006                                                *
Fil's avatar
Fil a validé
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/


Yannick Patois's avatar
Yannick Patois a validé
//
if (!defined("_ECRIRE_INC_VERSION")) return;
Yannick Patois's avatar
Yannick Patois a validé

function ecrire_stats() {
	global $id_article, $id_breve, $id_rubrique;
	// Rejet des robots (qui sont pourtant des humains comme les autres)
	if (preg_match(
	',google|yahoo|msnbot|crawl|lycos|voila|slurp|jeeves|teoma,i',
	$_SERVER['HTTP_USER_AGENT']))
		return;

	// Ne pas compter les visiteurs sur les flux rss (qui sont pourtant
	// des pages web comme les autres) [hack pourri en attendant de trouver
	// une meilleure idee ?]
	if (preg_match(',^backend,', $GLOBALS['fond']))
		return;
	// Identification de l'element
	if ($log_id_num = intval($id_rubrique))
	else if ($log_id_num = intval($id_article))
	else if ($log_id_num = intval($id_breve))
	// Identification du client ("unique")
	if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
		$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
	} else {
		$client_ip = $_SERVER['REMOTE_ADDR'];
	}
	$client_id = substr(md5(
		$client_ip . $_SERVER['HTTP_USER_AGENT']
		. $_SERVER['HTTP_ACCEPT'] . $_SERVER['HTTP_ACCEPT_LANGUAGE']
		. $_SERVER['HTTP_ACCEPT_ENCODING']
	), 0,10);
Fil's avatar
 
Fil a validé
	// Analyse du referer
	if ($log_referer = $_SERVER['HTTP_REFERER']) {
Fil's avatar
 
Fil a validé
		$url_site_spip = preg_replace(',^((https?|ftp)://)?(www\.)?,i', '',
esj's avatar
 
esj a validé
			$GLOBALS['meta']['adresse_site']);
Fil's avatar
 
Fil a validé
		if (($url_site_spip<>'')
		AND strpos('-'.strtolower($log_referer), strtolower($url_site_spip))
		AND !$_GET['var_recherche'])
			$log_referer = '';
		else
			$referer_md5 = '0x'.substr(md5($log_referer), 0, 15);
Fil's avatar
Fil a validé
	}
	// stockage sous forme de fichier ecrire/data/stats_200511161005/client_id
Fil's avatar
 
Fil a validé
	// 1. Chercher dans les paniers recents (moins de 30 minutes) s'il existe
	// deja une session pour ce numero IP. Chaque panier couvre 5 minutes
	$content = array();
	for ($i = -5; $i <= 0; $i++) {
		$panier = date('YmdHi', (intval(time()/300)+$i)*300);
		if (@file_exists($s = _DIR_SESSIONS.'stats_'.$panier.'/'.$client_id)) {
Fil's avatar
 
Fil a validé
			lire_fichier($s, $content);
			$content = @unserialize($content);
			if ($i<0) @unlink($s);
			break;
Antoine Pitrou's avatar
Antoine Pitrou a validé
		}
Fil's avatar
 
Fil a validé
	}

	// 2. Determiner le fichier session dans le panier actuel
	$panier = date('YmdHi', (intval(time()/300))*300);
	$dir = _DIR_SESSIONS.creer_repertoire(_DIR_SESSIONS,'stats_'.$panier);
Fil's avatar
 
Fil a validé
	// 3. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
	if (count($content) < 200) {
		$entree = trim("$log_type\t$log_id_num\t$log_referer");
		$content[$entree] ++;
		ecrire_fichier($s, serialize($content));
Yannick Patois's avatar
Yannick Patois a validé
	}
Yannick Patois's avatar
Yannick Patois a validé
?>