begin process at 2012 02 05 02:54:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] LIVE COUNTER || QUI EST EN LIGNE

[PHP5] LIVE COUNTER || QUI EST EN LIGNE


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :connecte, live counter, bot, php5 Niveau :Débutant Date de création :04/01/2009 Date de mise à jour :05/01/2009 21:16:48 Vu :3 465

Auteur : Teclis01

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Je fournis juste la source pour le faire avec l'exemple en bas de cette dernière.

C'est une source faite rapidement pour des besoins personnels et n'ayant rien trouvé qui me plaisait, je la pose ici en espérant qu'elle puisse en aider certains d'entre vous.

N'oubliez pas de créer les 2 fichiers de log !!! (la config utilisé dans l'exemple est dans un dossier common 1 niveau au dessus de la classe et devra s'appeller "common")

Les fonctionnalités sont :
_Log des ip connecté avec timestamp du dernier refresh (sans blague ;) )
(le timestamp est réglé sur 300 a vous de voir la config qui vous correspond!)
_Filtrage des bots
_Log des bot (pour espionner quel bot espionne votre site :D )
_On pourrait ajouter facilement le User Agent histoire de ^^

Voilà

Source

  • <?php
  • class LiveCounter{
  • private $m_sFileIp;
  • private $m_sFileBot;
  • private $m_aisIp=array();
  • private $m_sUserAgent;
  • private $m_assPossibleBotIp=array(
  • 'Google'=>'66.249',
  • 'Msn1'=>'207.68.146',
  • 'Msn2'=>'65.54.188',
  • 'Yahoo1'=>'66.196',
  • 'Yahoo2'=>'68.142',
  • 'Voila'=>'195.101.94',
  • 'WiseNut1'=>'64.241.243.65',
  • 'WiseNut2'=>'209.249.67',
  • 'WiseNut3'=>'64.241.242.177',
  • 'Fast'=>'66.77.73',
  • 'Teoma1'=>'65.214.36',
  • 'Teoma'=>'65.214.38.10'
  • );
  • const TIME_MAX=300;
  • const FILTER_BOT=true;
  • const LOG_BOT=true;
  • public function __construct($sFileIp,$sFileBot,$sIp='',$sUserAgent=''){
  • if(file_exists($sFileIp)){
  • $this->m_sFileIp=$sFileIp;
  • }
  • if(file_exists($sFileBot)){
  • $this->m_sFileBot=$sFileBot;
  • }
  • if($sIp!==''){
  • $this->m_aisIp=explode('.',$sIp);
  • }
  • if($sUserAgent!==''){
  • $this->m_sUserAgent=$sUserAgent;
  • }
  • }
  • public function __destruct(){
  • }
  • public function update(){
  • $aisLine=$this->getConnected();
  • if(!empty($aisLine)){
  • $iVisiteur=count($aisLine);
  • }
  • $iTime=time();
  • if(!empty($aisLine)){
  • $aisFileResult=array();
  • $bFind=false;
  • foreach($aisLine as $iLine=>$sLine){
  • $aisLineExploded=explode('.',$sLine);
  • //update myself
  • if(!empty($this->m_aisIp)){
  • if($aisLineExploded[0]===$this->m_aisIp[0] && $aisLineExploded[1]===$this->m_aisIp[1] && $aisLineExploded[2]===$this->m_aisIp[2] && $aisLineExploded[3]===$this->m_aisIp[3]){
  • if(self::FILTER_BOT===true && true===$this->filterBot()){
  • //$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • else{
  • $aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • $bFind=true;
  • }
  • else{
  • $aisFileResult[]=$this->updateLine($aisLineExploded,$iTime);
  • }
  • }
  • else{
  • $aisFileResult[]=$this->updateLine($aisLineExploded,$iTime);
  • }
  • }
  • if(!$bFind){
  • if(!empty($this->m_aisIp)){
  • if(self::FILTER_BOT===true && true===$this->filterBot()){
  • //$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • else{
  • $aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • }
  • }
  • }
  • else{
  • if(!empty($this->m_aisIp)){
  • if(self::FILTER_BOT===true && true===$this->filterBot()){
  • //$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • else{
  • $aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
  • }
  • }
  • }
  • $this->logIps($aisFileResult);
  • }
  • private function updateLine($aisLineExploded,$iTime){
  • //update others ip
  • $sResult='';
  • if(!empty($this->m_aisIp)){
  • if($aisLineExploded[0]!==$this->m_aisIp[0] || $aisLineExploded[1]!==$this->m_aisIp[1] || $aisLineExploded[2]!==$this->m_aisIp[2] || $aisLineExploded[3]!==$this->m_aisIp[3]){
  • if($aisLineExploded[4]>$iTime-self::TIME_MAX){
  • $sResult=$this->addIp($aisLineExploded,$aisLineExploded[4]);
  • }
  • }
  • }
  • else{
  • if($aisLineExploded[4]>$iTime-self::TIME_MAX){
  • $sResult=$this->addIp($aisLineExploded,$aisLineExploded[4]);
  • }
  • }
  • return $sResult;
  • }
  • private function addIp($aisIp,$iTime){
  • return $aisIp[0].'.'.$aisIp[1].'.'.$aisIp[2].'.'.$aisIp[3].'.'.$iTime;
  • }
  • private function filterBot(){
  • $bIsPosibleBot=false;
  • if(!empty($this->m_aisIp)){
  • foreach($this->m_assPossibleBotIp as $sBot =>$sIp){
  • $aiiBotIp=explode('.',$sIp);
  • $iIpParts=count($aiiBotIp);
  • $bIpIntegrity=true;
  • for($iCurrentIpPart=0;$iCurrentIpPart<$iIpParts;$iCurrentIpPart++){
  • if($bIpIntegrity===true && $aiiBotIp[$iCurrentIpPart]==$this->m_aisIp[$iCurrentIpPart]){
  • //always is a possible bot
  • }
  • else{
  • $bIpIntegrity=false;
  • //a while will be better to exit for
  • $iCurrentIpPart=$iIpParts;
  • }
  • }
  • if($bIpIntegrity===true){
  • $bIsPosibleBot=true;
  • if(true===self::LOG_BOT){
  • $this->logBot($sBot);
  • }
  • }
  • }
  • }
  • return $bIsPosibleBot;
  • }
  • private function logBot($mBotName){
  • if(null!==$this->m_sFileBot){
  • if(is_resource($rFile=fopen($this->m_sFileBot,'a'))){
  • if(flock($rFile,LOCK_EX)){
  • fwrite($rFile,$mBotName.' : '.implode('.',$this->m_aisIp).' : '.$this->m_sUserAgent."\n");
  • }
  • fclose($rFile);
  • }
  • }
  • }
  • private function logIps($aisFileResult){
  • if(!empty($aisFileResult)){
  • $sFileContent=implode("\n",$aisFileResult);
  • if(is_resource($rFile=fopen($this->m_sFileIp,'w'))){
  • if(flock($rFile,LOCK_EX)){
  • fwrite($rFile,$sFileContent);
  • }
  • fclose($rFile);
  • }
  • }
  • }
  • public function getConnected(){
  • $aisConnected=array();
  • if(file_exists($this->m_sFileIp)){
  • $aisLine=file($this->m_sFileIp);
  • if(!empty($aisLine)){
  • foreach($aisLine as $sLine){
  • //fucking \n which hide and fout le bordel >_<
  • $sLine=str_replace("\n",'',$sLine);
  • $aisConnected[]=$sLine;
  • }
  • }
  • }
  • return $aisConnected;
  • }
  • }
  • /*
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','64.241.242.177','');
  • $oLiveCounter->update();
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','65.214.38.10','');
  • $oLiveCounter->update();
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','127.0.0.1','');
  • $oLiveCounter->update();
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','192.168.0.0','');
  • $oLiveCounter->update();
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','192.168.0.1','');
  • $oLiveCounter->update();
  • $oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','66.249.22.1','');
  • $oLiveCounter->update();
  • */
  • ?>
<?php

class LiveCounter{
	
	private $m_sFileIp;
	private $m_sFileBot;
	private $m_aisIp=array();
	private $m_sUserAgent;
	
	private $m_assPossibleBotIp=array(
		'Google'=>'66.249',
		'Msn1'=>'207.68.146',
		'Msn2'=>'65.54.188',
		'Yahoo1'=>'66.196',
		'Yahoo2'=>'68.142',
		'Voila'=>'195.101.94',
		'WiseNut1'=>'64.241.243.65',
		'WiseNut2'=>'209.249.67',
		'WiseNut3'=>'64.241.242.177',
		'Fast'=>'66.77.73',
		'Teoma1'=>'65.214.36',
		'Teoma'=>'65.214.38.10'
	);
	
	const TIME_MAX=300;
	const FILTER_BOT=true;
	const LOG_BOT=true;
	
	public function __construct($sFileIp,$sFileBot,$sIp='',$sUserAgent=''){
		if(file_exists($sFileIp)){
			$this->m_sFileIp=$sFileIp;
		}
		if(file_exists($sFileBot)){
			$this->m_sFileBot=$sFileBot;
		}
		if($sIp!==''){
			$this->m_aisIp=explode('.',$sIp);
		}
		if($sUserAgent!==''){
			$this->m_sUserAgent=$sUserAgent;
		}
	}
	
	public function __destruct(){
		
	}
	
	public function update(){
		$aisLine=$this->getConnected();
		if(!empty($aisLine)){
			$iVisiteur=count($aisLine);
		}
		$iTime=time();
		if(!empty($aisLine)){
			$aisFileResult=array();
			$bFind=false;
			foreach($aisLine as $iLine=>$sLine){
				$aisLineExploded=explode('.',$sLine);
				//update myself
				if(!empty($this->m_aisIp)){
					if($aisLineExploded[0]===$this->m_aisIp[0] && $aisLineExploded[1]===$this->m_aisIp[1] && $aisLineExploded[2]===$this->m_aisIp[2] && $aisLineExploded[3]===$this->m_aisIp[3]){
						if(self::FILTER_BOT===true && true===$this->filterBot()){
							//$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
						}
						else{
							$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
						}
						$bFind=true;
					}
					else{
						$aisFileResult[]=$this->updateLine($aisLineExploded,$iTime);
					}
				}
				else{
					$aisFileResult[]=$this->updateLine($aisLineExploded,$iTime);
				}
			}
			if(!$bFind){
				if(!empty($this->m_aisIp)){
					if(self::FILTER_BOT===true && true===$this->filterBot()){
						//$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
					}
					else{
						$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
					}
				}
			}
		}
		else{
			if(!empty($this->m_aisIp)){
				if(self::FILTER_BOT===true && true===$this->filterBot()){
					//$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
				}
				else{
					$aisFileResult[]=$this->addIp($this->m_aisIp,$iTime);
				}
			}
		}
		$this->logIps($aisFileResult);
	}
	
	private function updateLine($aisLineExploded,$iTime){
		//update others ip
		$sResult='';
		if(!empty($this->m_aisIp)){
			if($aisLineExploded[0]!==$this->m_aisIp[0] || $aisLineExploded[1]!==$this->m_aisIp[1] || $aisLineExploded[2]!==$this->m_aisIp[2] || $aisLineExploded[3]!==$this->m_aisIp[3]){
				if($aisLineExploded[4]>$iTime-self::TIME_MAX){
					$sResult=$this->addIp($aisLineExploded,$aisLineExploded[4]);
				}
			}
		}
		else{
			if($aisLineExploded[4]>$iTime-self::TIME_MAX){
				$sResult=$this->addIp($aisLineExploded,$aisLineExploded[4]);
			}
		}
		return $sResult;
	}
	
	private function addIp($aisIp,$iTime){
		return $aisIp[0].'.'.$aisIp[1].'.'.$aisIp[2].'.'.$aisIp[3].'.'.$iTime;
	}
	
	private function filterBot(){
		$bIsPosibleBot=false;
		if(!empty($this->m_aisIp)){
			foreach($this->m_assPossibleBotIp as $sBot =>$sIp){
				$aiiBotIp=explode('.',$sIp);
				$iIpParts=count($aiiBotIp);
				$bIpIntegrity=true;
				for($iCurrentIpPart=0;$iCurrentIpPart<$iIpParts;$iCurrentIpPart++){
					if($bIpIntegrity===true && $aiiBotIp[$iCurrentIpPart]==$this->m_aisIp[$iCurrentIpPart]){
						//always is a possible bot
					}
					else{
						$bIpIntegrity=false;
						//a while will be better to exit for
						$iCurrentIpPart=$iIpParts;
					}
				}
				if($bIpIntegrity===true){
					$bIsPosibleBot=true;
					if(true===self::LOG_BOT){
						$this->logBot($sBot);
					}
				}
			}
		}
		return $bIsPosibleBot;
	}
	
	private function logBot($mBotName){
		if(null!==$this->m_sFileBot){
			if(is_resource($rFile=fopen($this->m_sFileBot,'a'))){
				if(flock($rFile,LOCK_EX)){
					fwrite($rFile,$mBotName.' : '.implode('.',$this->m_aisIp).' : '.$this->m_sUserAgent."\n");
				}
				fclose($rFile);
			}
		}
	}
	
	private function logIps($aisFileResult){
		if(!empty($aisFileResult)){
			$sFileContent=implode("\n",$aisFileResult);
			if(is_resource($rFile=fopen($this->m_sFileIp,'w'))){
				if(flock($rFile,LOCK_EX)){
					fwrite($rFile,$sFileContent);
				}
				fclose($rFile);
			}
		}
	}
	
	public function getConnected(){
		$aisConnected=array();
		if(file_exists($this->m_sFileIp)){
			$aisLine=file($this->m_sFileIp);
			if(!empty($aisLine)){
				foreach($aisLine as $sLine){
					//fucking \n which hide and fout le bordel >_<
					$sLine=str_replace("\n",'',$sLine);
					$aisConnected[]=$sLine;
				}
			}
		}
		return $aisConnected;
	}
	
}
/*
$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','64.241.242.177','');
$oLiveCounter->update();

$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','65.214.38.10','');
$oLiveCounter->update();

$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','127.0.0.1','');
$oLiveCounter->update();

$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','192.168.0.0','');
$oLiveCounter->update();

$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','192.168.0.1','');
$oLiveCounter->update();

$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt','66.249.22.1','');
$oLiveCounter->update();
*/
?>



 Historique

04 janvier 2009 18:47:41 :
Ajout d'une méthode plus propre et surtout plus utile pour récuperer les connectés (qui est quand même le but du bouzin ^^)
04 janvier 2009 19:14:22 :
Il manquait un if pour le timestamp pour virer les trop vieux ^^
05 janvier 2009 21:16:48 :
Ajout d'une méthode pour logger l'array d'ip via une méthode pour rendre la classe un poils plus modifiable.

 Sources du même auteur

Source avec Zip [PHP5] ORMAPPER 4 CRUD
Source avec Zip Source avec une capture JUKE BOX XMMS

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme
Source avec Zip Source avec une capture TODO LIST (AJAX/PHP5) par VinceMonkeyz
CLASSE WIKILOC par aKheNathOn
Source avec Zip Source avec une capture BOT IRC POO par divx78

Commentaires et avis

Commentaire de ooseboo le 05/01/2009 11:03:52

Salut :)

Source intéressante pour logger les accès :)

En revanche une petite remarque, je m'attendais en lisant la source de voir une methode logIp comme tu l'as fais pour logBot ce qui permet a un futur utilisateur de ton API de modifier juste les 2 méthodes la dans le cas ou il veut logger en bdd plutot que dans un fichier.

Commentaire de Teclis01 le 05/01/2009 11:45:14

Ce sera modifié ce soir :) et merci pour le commentaire!

Commentaire de Teclis01 le 05/01/2009 21:18:45

Voilà ok c'est sauvage mais ça doit marcher ^_^

Commentaire de ooseboo le 06/01/2009 12:05:12 7/10

Merci :)

Commentaire de Archima le 12/01/2009 19:17:06

Cette source me paraît bien utilise, j'aimerai l'intégrer sur mon site, sauf que je vois pas comment >_< je m'y connais pas d'un niveau aussi élevé en php...

Pourrais ton m'expliquer ?

Commentaire de Teclis01 le 14/01/2009 21:57:40

Et bien a chaque page que les utilisateurs visiteront, il faut ajouter ces lignes...
$oLiveCounter=new LiveCounter('../common/count.txt','../common/logbot.txt',$REMOTE_ADDR,'');
$oLiveCounter->update();

Commentaire de lemagicien84 le 16/01/2009 00:55:26

un peu trop long je pense

Commentaire de Teclis01 le 16/01/2009 15:13:06

et bien tu le met dans un fichier inclu dans chaque page... genre dans le config.php
Sinon et bien tu as aucun suivi :)

Commentaire de lemagicien84 le 16/01/2009 18:44:24

si je comprend bien le fichier sera inclus dans chacune de mes pages?afin qu'il ai un suivi?

Commentaire de Teclis01 le 19/01/2009 22:31:05

Disons que a chaque fois que tu executeras mon script, tu mettras a jour qui est connecté. Il ne suffit pas de le faire une fois! D'où la question de suivi...
En plus il y a quelques défauts car si un utilisateur ne donne pas signe de vie pendant 300 s. ou ms. je sais plus ^_^ il sera considéré comme plus là alors qu'il est toujours là mais je crois qu'on ne peut rien faire contre ça...

Commentaire de lemagicien84 le 19/01/2009 22:38:58

ok en tout cas merci pour ce script ca va m'aider pour compter

Commentaire de tomtommorant le 29/01/2009 19:09:46

Moi je comprend pas , je receoit le message d'erreur disant ="Parse Error ................ on line 4

Commentaire de Teclis01 le 09/02/2009 17:52:01

Je te conseilles juste alors de lire les char 1 à 5 du titre de ma source... tu es surement en 4.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

erreur 500 aléatoire [ par eax ] bonjour à tous!j'ai un problème qui est assez curieux et qui semble être lié à ma redirection en .comen effet lorsque je me connecte sur www.bitsenfol Problème de cookies [ par iomega ] Bonjour a tousJ'ai deux serveurs les 2 avec eseayphp 1.6 sur le 1er quand je me connecte le cookies dure toute la session jusqu'a la fermeture du brow differnec entre php 4 et php5 [ par hardelgylls ] Bonjourpetite question :j'ai passer un oral et l'examinateur m'a demandé quel était la différence entre php4 et php5. et la gros blanc, est ce que qqu Doc PHP5 sniff sniff [ par slhuilli ] Bonjour, Bonsoir,Je suis a la recherche d'un PDF qui recenserait les mots-clefs + explications (bref un bouquin complet) sur PHP 5 qui parait-il est [Session] sous ie [ par petit_stagiaire ] Bonjour,je gère des sessions pour un accès membre.Lorsqu'un utilisateur se connecte je remplis $SESSION['nom']...Mon problème vient de l'utilisation d Pb passage PHP4 -> PHP5 [ par Galmiza ] Salut,J'ai acheté un bouquin pour débuter le PHP.J'ai suivi a la lettre les instructions du livre:-installer EasyPHP 1.7-installer PHP 5.0..-lancer Ea Cohabitation PHP4 PHP5 sur même serveur ! [ par Zacland ] Ce n'est pas une question, mais je me doute que certaines personnes veulent essayer de faire cohabiter 2 versions de PHP sur un même serveur Apache... Un caractére se trouve t'il dans ma chaîne... [ par juki_webmaster ] Bonsoir,Je travaille depuis 14h cette apres-midi sur une fonction alternative d'une fonction connu et disponible uniquement sur php5, je fait cette fo PHP5 en PHP3 [ par el shaddai ] J'ai développé une partie de site en PHP5. MAlheureusement , chargé chez FREE, ils n'utilisent que PHP3. Y a t-il une manip simple pour qur du PHP5 pa PHP5 et MySQL 4.1.7 [ par TMT ] J'ai installé PHP5 et MySQL sur mon Windows XP avec IIS. J'ai bien activé le module php_mysql dans le fichier php.ini Là mon problème est qu-à chaque


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,494 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales