Számláló (counter)

Esmét a blog szerkesztése...
Mivel ebből sem találtam kedvemre valót, így írtam eggyet.

Nos akkor az alapok. Szinte az összes ilyen számláló pontatlan. Ez tény. Gyakorlatilag 3 féle megodás (és ezek esetleges kombinációi) jön számításba. IP cím alapján azonosítjuk a felhasználót. Csakhogy azonos címről többen is látogathatják az odalt (például egy nagyobb cég dolgozói), illetve változhat a felhasználó IP-je is idő közben. Süti (cookie) alapú, mikoris a felhasználó gépén tároljuk az adatokat. Azonban a felhasználó ezt akár le is tilthatja... Illetve még a munkamenet alapú azonosítás jöhet szóba (ugyanazt a karaktersort "hordozza" a felhasználó az oldalon való barangoláskor). Itt azonban ha a látogató tétlen, akkor (szerver beállítástól függően) egy idő után (tipikusan 2-4 óra) ezt eldobja a szerver, így az erre épülő scriptek is új látogatónak fogják számolni.

Ez a megoldás az IP alapú azonosítás egy fajtája. Eddig 2 megoldást láttam, egyik sem tetszett. A címeket valahol átmenetileg tárolni kell. Erre 2 megoldás található a leírásokban. Választhatod, hogy adatbázisban tárolod, vagy egy text fájlban.
Adatbázis nem mindenhol elérhető (gondolok itt elsősorban az ingyenes tárhelyekre), a fájlt viszont nehézkes kezelni...

Arra gondoltam, hogy az IP cím alapján 1-1 fájlt hozok létre. Így viszonylag egyszerű a program, nem is lassabb mint a másik fájl alapú megoldás. Cserébe viszont több helyre van szüksége. (egyetlen címet tárol kb. 4 kilobájton, míg ha fájlba írja akkor ugyanekkora helyen nagyjából 300-at)


<?php


function Szamlalo($file, $file2, $mappa, $torlesi_ido)
{

$c_txt=$mappa."/".$file;
$c2_txt=$mappa."/".$file2;
# ======Régi fájlok törlése======
// mappa létezésének vizsgálata
if( !$mappanyit = @opendir($mappa) )
return;
while( false !== ($filename = readdir($mappanyit)) )
	{
	if( $filename != "." && $filename != ".." && $filename != "count.txt" && $filename != "index.php" && $filename != "count_ip.txt")
		{
		$filename = $mappa."/".$filename;
		if( @filemtime($filename) < (time()-$torlesi_ido) )
		@unlink($filename);
		}
	}
	@closedir($mappa);  

// Oldal letöltés számláló

if (file_exists($c_txt))
{
$fp = fopen($c_txt,"r");
$letolt_szam = fread($fp, filesize($c_txt));
fclose($fp);

$letolt_szam=$letolt_szam+1;
$fp = fopen($c_txt,"w");
fwrite($fp, $letolt_szam);
fclose($fp);
}


$ip = getenv('REMOTE_ADDR'); 
$ip=str_replace(".","-",$ip);
$ip_fajl=$mappa."/".$ip.".txt";

$fp = fopen($c2_txt,"r");
$ip_szam = fread($fp, filesize($c2_txt));
fclose($fp);

	if (file_exists($ip_fajl))
	{
		$fp = fopen($ip_fajl,"w");
		fwrite($fp, "0");
		fclose($fp);

	}
	else
	{
		$fp = fopen($ip_fajl,"w");
		fwrite($fp, "0");
		fclose($fp);
		
		$ip_szam=$ip_szam+1;
		
		$fp = fopen($c2_txt,"w");
		fwrite($fp, $ip_szam);
		fclose($fp);
	}
return array($letolt_szam, $ip_szam);
}




$file = "count.txt";
$file2="count_ip.txt";
$mappa="./count";
$torlesi_ido=54000;

list($letolt_szam, $ip_szam) =Szamlalo($file, $file2, $mappa, $torlesi_ido);
	echo "<b>".$letolt_szam."</b><br />";
	echo "<b>".$ip_szam."</b><br />";

?>


S akkor lássuk mit is csinál. Tehát nyilván a kezdő, php felhasználóknak szól, aki azért a funkciók és hasonlók jelentésével azért már tisztában van... S igen, a kezdő felhasználók miatt megpróbáltam átlátható kódot írni (így pl. $valtozo=$valtozo+1 szerepel, és nem $valtozo+=1, stb.)
Az első részben megnézzük hogy létezik-e a mappa, majd néhány kivételtől eltekintve a régieket töröljük. A $torlesi_ido-t másodpercben kell megadni.
Következik az oldal letöltés számláló. Itt gyakorlatilag csak a count.txt fájlban tárolt számot kiolvassuk, hozzáadunk egyet, majd ezt visszaírjuk a fájlba, és megjelenítjük. Tehát itt ha a felhasználó frissíti az oldalt, az ismét számolja.
A következő rész már izgalmasabb kicsit. A látogató IP címét letesszük egy változóba. Ezután kis átalakítás (a .-ot kötőjelre cseréljük), majd megnézzük hogy van-e ilyen nevű .txt fájl. S ezzel már el is döntöttük, hogy erről a címről volt-e látogató a beállított időn belül.
Ezután már csak létrehozzuk a fájlt (ha nem volt), növeljük a számlálót, és kiírjuk. Ha "ismerős" a cím, akkor csak egyszerűen kitesszük a számláló értékét mindenféle változtatás nélkül...
S persze egy egyszerű példa is, hogyan kell használni.

Az egészet egybe (almappával a két szükséges fájllal) letöltheted.
Ha így szeretnéd kipróbálni, akkor ne felejtsd el a count mappa írását engedélyezni.

Használatára nézve csak annyi megkötés van, hogy ne add el. Szabadon variálhatod, még csak a forrást sem kell megjeölni.

Jó munkát!

2012. Szeptember 10. 22.00

Megosztás Google Buzz-on Del.icio.us-hez ad Megosztás Digg-en Hozzáadás a Google könyvjelzőkhöz Megosztás MySpace-en Hozzáadás MSN könyvjelzőkhöz Hozzáadás Yahoo! könyvjelzőkhöz Reddit StumbleUpon

© 2003-2013 Antal László
Valid Robots.txt XHTML 1.0 CSS 2.1 WCAG 1.0 XHTML 1.0 (WDG) CSS 2.1 (WDG) Akadálymentes oldal (link a paramédia weboldalra) I ¦ Validator [Valid RSS]
elektronikus levél az oldal szerkesztőjének RSS hírcsatorna is elérhető Ugrás a nyitólapra. Vendégkönyv... Az oldal blogja...