Classe : compteur de visiteurs connectés au site

Contenu du snippet

Petite classe permettant d'afficher, sans base de données, le nombre de connectés sur son site.

N'hésitez pas à me suggérer des améliorations.

Source / Exemple :


<?php

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 $userIp; var $cache_file; var $cache_time; var $cache_filename; /* $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') { $dir = substr($dir, -1) == '/' ? $dir : $dir . '/'; if (!is_dir($dir)) { mkdir($dir); } $this->dir = $dir; $this->idle = $idle; $this->userIp = $this->getIp(); $this->file = $this->dir . md5($this->userIp); $this->cache_filename = $cache_filename; $this->cache_file = $this->dir . $cache_filename; $this->cache_time = $cache_time; } /* 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':'') : ''); } /* 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; } } } ?>

Conclusion :


Vos commentaires sont les bienvenus.

-------------
UTILISATION
-------------

include('counter.class.php');
$counter = new counter('howmany/', 60);
$counter->update();

echo $counter->view();

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.