[php5] live counter || qui est en ligne

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

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.