Einfacher Besucherzähler ohne DB als Snippet
Anstatt einer Session-ID benutze ich eine anonymisierte User IP damit dieser nur einmal pro Tag gezählt wird.
Wer mehr als 100 IP's pro Tag speichern will, sollte das in einer Datenbank tun.
Je Besucherzähler werden 3 Dateien im /assets Verzeichnis von MODX angelegt.
<?php
# Snippet Aufruf z.B.: [[!webCounter? &cname=`web4Count` &startnum=`4440`]]
$numip = '20'; # Anzahl der IP-Nummern
$numipRIP = 24*60*60; # IP-Nummern löschen wenn älter als 1 Tag
$startnum = $modx->getOption(startnum,$scriptProperties,1);
$get_countname = $modx->getOption('cname',$scriptProperties,'webCount');
$countname = $modx->config['base_path'].'assets/'.$get_countname.'.txt';
$ipfile = $modx->config['base_path'].'assets/'.$get_countname.'_ip.txt';
$datumstart = $modx->config['base_path'].'assets/'.$get_countname.'_datumstart.txt';
$userip = $_SERVER['REMOTE_ADDR'];
# IP anonymisieren!
$ipsplit = explode(".", $userip);
$userip = "$ipsplit[0].$ipsplit[1].$ipsplit[2].0";
if(!file_exists($datumstart)){
$fo = fopen($datumstart,'w+');
fputs($fo, time());
fclose($fo);
}
if(!file_exists($countname)){
$fo = fopen($countname,'w+');
fputs($fo, $startnum);
fclose($fo);
}
if(!file_exists($ipfile)){
$foip = fopen($ipfile, 'w+');
fputs($foip, $userip.':');
fclose($foip);
}
# wenn äter als $numipRIP dann löschen
if(file_exists($datumstart)){
$fodatum = fopen($datumstart,'r');
$datum1 = fgets($fodatum, 11);
fclose($fodatum);
}
$datum2 = $datum1 + $numipRIP;
$datumheute = time();
if($datumheute > $datum2) {
unlink($datumstart);
if(!file_exists($datumstart)){
$fo = fopen($datumstart,'w+');
fputs($fo, time());
fclose($fo);
}
unlink($ipfile);
if(!file_exists($ipfile)){
$foip = fopen($ipfile, 'w+');
# fputs($foip, $userip.':');
fclose($foip);
}
}
$ipcont = fopen($ipfile,'r+');
$ipfile1 = fgets($ipcont,2048);
$ipdata = explode(':',$ipfile1);
if(in_array($userip, $ipdata)){
$anzahl = fopen($countname,'r+');
$nummer = fgets($anzahl,10);
fclose($anzahl);
}
else{
$num = count($ipdata);
if($num <= $numip){
fputs($ipcont,$userip.':');
fclose($ipcont);
$anzahl = fopen($countname,'r+');
$nummer = fgets($anzahl,10);
$nummer++;
fseek($anzahl,0);
fputs($anzahl,$nummer);
fclose($anzahl);
}
else{
$pop = array_pop($ipdata);
array_unshift($ipdata,$userip);
$userip2 = implode(':',$ipdata);
$ipcont = fopen($ipfile,'r+');
fputs($ipcont,$userip2);
fclose($ipcont);
$anzahl = fopen($countname,'r+');
$nummer = fgets($anzahl,10);
$nummer++;
fseek($anzahl,0);
fputs($anzahl,$nummer);
fclose($anzahl);
}
}
return $nummer;