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!