.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
.22
.23
.24
.25
.26
.27
.28
.29
.30
.31
.32
.33
.34
.35
.36
.37
.38
.39
.40
.41
.42
.43
.44
.45
.46
.47
.48
.49
.50
.51
.52
.53
.54
.55
.56
.57
.58
.59
.60
.61
.62
.63
.64
.65
.66
.67
.68
.69
.70
.71
.72
.73
.74
.75
.76
.77
.78
.79
.80
.81
.82
.83
.84
.85
.86
.87
.88
.89
.90
.91
.92
.93
.94
.95
.96
.97
.98
.99
.100
.101
.102
.103
.104
.105
.106
.107
.108
.109
.110
.111
.112
.113
.114
.115
.116
.117
.118
.119
.120
.121
.122
.123
.124
.125
.126
.127
.128
.129
.130
.131
.132
.133
.134
.135
.136
.137
.138
.139
.140
.141
.142
.143
.144
.145
.146
.147
.148
.149
.150
.151
.152
.153
.154
.155
.156
.157
.158
.159
.160
.161
.162
.163
.164
.165
.166
.167
.168
.169
.170
.171
.172
.173
.174
.175
.176
.177
.178
.179
.180
.181
.182
.183
.184
.185
.186
.187
.188
.189
.190
.191
.192
.193
.194
.195
.196
.197
.198
.199
.200
.201
.202
.203
.204
.205
.206
.207
.208
.209
.210
.211
.212
.213
.214
.215
.216
.217
.218
.219
.220
.221
.222
.223
.224
.225
.226
.227
.228
.229
.230
.231
.232
.233
.234
.235
.236
.237
.238
.239
.240
.241
.242
.243
.244
.245
.246
.247
.248
.249
.250
.251
.252
.253
.254
.255
.256
.257
.258
.259
.260
.261
.262
.263
.264
.265
.266
.267
.268
.269
.270
.271
.272
.273
.274
.275
.276
.277
.278
.279
.280
.281
.282
.283
.284
.285
.286
.287
.288
.289
.290
.291
.292
.293
.294
.295
.296
.297
.298
.299
.300
.301
.302
.303
.304
.305
.306
.307
.308
.309
.310
.311
.312
.313
.314
.315
.316
.317
.318
.319
.320
.321
.322
.323
.324
.325
.326
.327
.328
.329
.330
.331
.332
.333
.334
.335
.336
.337
.338
.339
.340
.341
.342
.343
.344
.345
|
|
<?php
/******************************************************************************/
/* */
/* __ ____ */
/* ___ / / ___ / __/__ __ _____________ ___ */
/* / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-< */
/* / .__/_//_/ .__/___/\___/\_,_/_/ \__/\__/___/ */
/* /_/ /_/ */
/* */
/* */
/******************************************************************************/
/* */
/* Titre : Compteur de connectés */
/* */
/* URL : http://www.phpsources.org/scripts365-PHP.htm */
/* Auteur : asterix */
/* Date édition : 28 Mars 2008 */
/* Website auteur : http://www.bloggif.com */
/* */
/******************************************************************************/
if (!defined('VERIF')) exit();
if (!class_exists('counter'))
{
/*
-------------------------------------------
Classe permettant d'afficher le nombre de
connectés d'un site sans base de données.
------------------------------------------
*/
class counter
{
var $dir;
var $file;
var $idle;
var $cache_file;
var $cache_time;
var $cache_filename;
var $cookie_name;
/*
$count : Gardera en mémoire le nombre de connectés.
*/
var $count = false;
/*
Constructeur
*/
function counter($dir = 'howmany/', $idle = 300, $cache_time = 60
, $cache_filename = 'cache.txt'
, $cookie_name = 'counterId')
{
$dir = substr($dir, -1) == '/' ? $dir : $dir . '/';
if (!is_dir($dir))
{
mkdir($dir);
}
$this->dir = $dir;
$this->idle = $idle;
$this->file = $this->dir . $this->userId();
$this->cache_filename = $cache_filename;
$this->cache_file = $this->dir . $cache_filename;
$this->cache_time = $cache_time;
$this->cookie_name = $cookie_name;
}
/*
update : Met à jour le fichier de l'utilisateur courant
*/
function update()
{
if (!@file_exists($this->file) || !@touch($this->file))
{
fopen($this->file, 'w');
}
}
/*
garbage : Nettoie le dossier - Suppréssion des fichiers obsolètes
*/
function garbage()
{
$timeCacheVerif = time() - $this->cache_time;
if ($h = opendir($this->dir))
{
while (false !== ($f = readdir($h)))
{
if ($f != '.' && $f != '..' && $f != $this->cache_filename)
{
$cfp = $this->dir . '/' . $f;
if (@filemtime($cfp) < $timeVerif)
{
@unlink($cfp);
}
}
}
}
}
/*
view : Affiche le nombre de connectés au site
*/
function view($text = true)
{
if ($this->count !== false)
{
$nb = $this->count;
}
else
{
$nb = $this->count();
}
return $nb . ($text ? ' connecté' . ($nb>1?'s':'') : '');
}
/*
userId : Renvoie un identifiant pour l'utilisateur
*/
function userId()
{
if (isset($_COOKIE[$this->cookie_name]) && preg_match('`^([a-z0-9]{32})$`',
$_COOKIE[$this->cookie_name]))
{
$cookId = $retId = $_COOKIE[$this->cookie_name];
$fileIp = $this->dir . md5($this->getIp());
if (file_exists($fileIp))
{
@unlink($fileIp);
}
}
else // Première page vue
{
$cookId = md5(uniqid(rand(), true));
$retId = md5($this->getIp());
}
if (!headers_sent())
{
setcookie($this->cookie_name, $cookId, time()+($this->idle*2), '/');
}
return $retId;
}
/*
getIp : Renvoie l'adresse IP de l'utilisateur
*/
function getIp()
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif (isset($_SERVER['HTTP_CLIENT_IP']))
{
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
/*
count : Retourne le nombre de connectés
*/
function count()
{
//clearstatcache();
$ok = false;
$timeCacheVerif = time() - $this->cache_time;
if (file_exists($this->cache_file) && @filemtime($this->cache_file) > $timeCacheVerif)
{
$content = $this->read($this->cache_file);
$key = substr($content, 0, 32);
$i = substr($content, 32);
if ($key == md5($i))
{
$ok = true;
}
}
if (!$ok)
{
if (!is_dir($this->dir)) return false;
$timeVerif = time() - $this->idle;
$i = 0;
if ($h = opendir($this->dir))
{
while (false !== ($f = readdir($h)))
{
if ($f != '.' && $f != '..' && $f != $this->cache_filename)
{
$cfp = $this->dir . '/' . $f;
if (@filemtime($cfp) > $timeVerif)
{
$i++;
}
else
{
@unlink($cfp);
}
}
}
}
$this->write($this->cache_file, md5($i) . $i, 'w');
}
$this->count = $i;
return $this->count;
}
/*
write : Ecrit dans un fichier
*/
function write($file, $content, $mode = 'a')
{
$fp = fopen($file, $mode);
if ($fp)
{
@flock($fp, LOCK_EX);
@fwrite($fp, $content, strlen($content));
@flock($fp, LOCK_UN);
@fclose($fp);
return true;
}
return false;
}
/*
read : Lit dans un fichier
*/
function read($file)
{
if (!@file_exists($file)) return false;
$fp = @fopen($file, 'r');
if ($fp)
{
@flock($fp, LOCK_SH);
$content = @fread($fp, @filesize($file));
@flock($fp, LOCK_UN);
@fclose($fp);
return $content;
}
return false;
}
}
}
/*
UTILISATION
include('counter.class.php');
$counter = new counter('howmany/', 60);
$counter->update();
echo $counter->view();
*/
?>
|