[php5] live counter || qui est en ligne

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 741 fois - Téléchargée 17 fois

Contenu du snippet

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 / Exemple :


<?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();

  • /
?>

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
Je te conseilles juste alors de lire les char 1 à 5 du titre de ma source... tu es surement en 4.
Messages postés
177
Date d'inscription
dimanche 6 avril 2008
Statut
Membre
Dernière intervention
27 octobre 2010

Moi je comprend pas , je receoit le message d'erreur disant ="Parse Error ................ on line 4
Messages postés
11
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
23 février 2009

ok en tout cas merci pour ce script ca va m'aider pour compter
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
29 décembre 2012
4
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...
Messages postés
11
Date d'inscription
samedi 10 mai 2008
Statut
Membre
Dernière intervention
23 février 2009

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

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.