Za svojo stran sem potreboval števec, ki bi mi omogočal preprosto štetje obiskovalcev. Zahteva je bila tudi, da naj bi omogočal blokiranje IP na določeno časovno obdobje (da se ne šteje vsak klik) in filtracijo lastnega IPja. Na internetu sem našel marsikateri števec, vendar so bili vsi preveč napihnjeni s funkcijami ali pa niso omogočali vsega kar sem hotel. Zato sem se spravil k pisanju svojega števca in tako je nastal tale števec, katerega koda je prosto na voljo. Pridal sem še postopek izdelave za tiste, ki bi se radi naučili programirati v PHP in to radi delajo na primerih.
Ko obiskovalec pride na stran, števec najprej prebere datoteko in počisti starejše vnose od časovne omejitev. Nato preveri, če je obiskovalčev IP še vedno prisoten. Če IPja v datoteki ni, prišteje 1 in doda obiskovalčev IP v datoteko. Tako je omogočeno samodejno čiščenje starih vnosov in pravično štetje.
Najprej je potrebno definirati nekaj spremenljivk in sicer, POT sem definiral kar kot konstanto, saj izgleda koda lepše brez $ :). Spremenljivka $blokiraj_ip vsebuje IPje, ki bi jim radi preprečili doprinos k štetju. Vanjo lahko vnesete poljubno število IPjev po spodaj videnem vzorcu.
DEFINE("POT","/pot/do/mape/"); //pot do datotek s IPji in številom obiskov
$obiski = POT . "obiski.txt"; //datoteka s obiski
$ipdat = POT . "IP.txt"; //datoteka z IPji
$blok = 100; //čas blokade v minutah
$blokiraj_ip = array("lastni.ip","nek drugi ip","itd"); //IPji, ki bi jih želeli blokirati
Opombe:
IP dobi skripta preko preverjanja spremenljivke $_SERVER['REMOTE_ADDR']. Če je računalnik slučajno za proxy strežnikom, se za IP uporabi njegov lastni IP in ne IP proxya s pomočjo spremenljivke $_SERVER['HTTP_X_FORWARDED_FOR']
$IP = $_SERVER["REMOTE_ADDR"];
//preveri proxy
if (($IP=="127.0.0.1") && ($_SERVER["HTTP_X_FORWARDED_FOR"]!=""))
{
$IP = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
Funkcija števec je glavna funkcija, ki se kliče ob zahtevku datoteke. Z ukazom global lahko prikličete spremenljivke, da jih ni potrebno ponovno definirati znotraj funkcije. Za preverjanje blokiranih IPjev, se uporablja funkcija in_array(), ki vrne FALSE, če IP ni najden znotraj polja. Če IP ni najden, se izvrši funkcija PreveriIP. Na koncu funkcije se izvrši še prikaz števca.
function Stevec()
{
global $obiski,$IP,$moj_ip;
if(in_array($IP,$blokiraj_ip) === FALSE) {
PreveriIP($IP);
}
echo file_get_contents($obiski);
}
Opombe:
Funkcija izgleda na prvi pogled dokaj zakomplicirano, zato sem jo razbil na več delov. Kot argument sprejema spremenljivko $ip, ki je IP obiskovalca. Spremenljivki $cas se določi UNIX timestamp, to je čas merjen v sekundah od 1.1.1970 00:00:00 GMT. S ukazom file(), se v spremenljivko $datoteka shrani celotna vsebina datoteke s IPji, razvrščena v array. Vsak prelom vrstice ustvari nov ključ v polju.
function PreveriIP($ip) {
global $ipdat,$blok;
$cas = time();
$datoteka = file($ipdat);
Koda najprej preveri, če je datoteka slučajno prazna, tako da preveri velikost arraya $datoteka. Če je velikost 0 vanjo zapiše trenutni IP in čas ločena s | (znak je pomemben pri kasnejši obdelavi podatkov), ter izvrši funkcijo Stej(), ki doda 1 k številu obiskov.
//če je datoteka prazna vanjo zapiši trenutni IP
if(sizeof($datoteka)==0) {
$fh = fopen($ipdat,"w+");
fputs($fh, "$ip|$cas \n");
Stej();
fclose($fh);
}
Če datoteka slučajno ni prazna, skripta definira nov array $nova_datoteka in vanj doda vnose, ki so mlajši od časa blokade s pomočjo array_push. Vnose, ki so že starejši, enostavno izpusti. Tako je sedaj datoteka očiščena.
else {
//če datoteka ni prazna, najprej pobriši vse stare vnose
$nova_datoteka = array();
foreach ($datoteka as $vrstica) {
$exp_vrstica = explode("|", $vrstica);
if(($exp_vrstica[1]+$blok*60)>$cas) {
array_push($nova_datoteka,$vrstica);
}
}
Sedaj je na vrsti iskanje trenutnega IPja v preostalem arrayu. Če je slučajno najden, to pomeni, da čas za odblokiranje še ni bil dosežen. V takem primeru se zanka prekine in zapiše vnose brez, da bi se izvršila funkcija Stej(). V nasprotnem primeru, se na konec arraya $nova_datoteka doda trenutni IP in čas, ter izvrši funkcija Stej().
//najdi IP. Če je v datoteki
//prekini zanko in pojdi na zapisovanje brez štetja
$dodaj = "d";
foreach($nova_datoteka as $vrstica) {
if(strpos($vrstica,$ip) !== FALSE) {
$dodaj = "n";
break;
}
}
if($dodaj == "d") {
Stej();
array_push($nova_datoteka,"$ip|$cas \n");
}
$fh = fopen($ipdat,"w+");
foreach($nova_datoteka as $nova_vrstica) {
fputs($fh, $nova_vrstica);
}
fclose($fh);
}
}
Funkcija Stej() je zadolžena za prištevanje obiskov v datoteko s obiski. Deluje zelo preprosto. V spremenljivko $total se prebere število dosedanjih obiskov. Temu se prišteje 1 in zapiše v datoteko.
function Stej() {
global $obiski;
$total = file_get_contents($obiski);
$nova_vrsta = $total + 1;
$fh = fopen($obiski,"w+");
fputs($fh,$nova_vrsta);
fclose($fh);
}
To je vse. Navodila kako skripto usposobiti in izvorno kodo najdete v desnem stolpcu. Če imate predloge za optmizacijo, mi jih sporočite na e-mail
Copyright 2002-2012 Andrej Mernik, vsa vprašanja na e-mail. Pa še Posebna zahvala. Stran je bojda narejena v skladu s XHTML standardi. Za spremljanje novosti lahko uporabite tudi RSS.
Vpišite besedo, ki bi jo radi našli na strani ali pa kliknite Najdi na tej strani. Na voljo vam je tudi Zemljevid strani.
Dobite si svoj iskalnik na http://www.freefind.com
| Najdi.si | |
| WolframAlpha | |
| Yahoo! | |
| Ask | |
| Bing | |
| Scirius |
Si obiskovalec številka
573706
od 14.7.2004
Uporaba skripte za komercialno uporabo (služenje denarja) je strogo prepovedana!
Zgornjo skripto si prenesite na disk in jo preimenujte v stevec.php. Nato ustvarite dve datoteki: eno za IPje, drugo za število obiskov. Pot do datoteke ustrezno spremenite (tako kot je zapisano levo v razlagi) in dodajte IPje, ki bi jih želeli blokirati. Za prikaz skripte uporabite le še funkcijo include("/pot/do/stevca/
stevec.php"); oziroma include("X:\\pot\\do\\
stevec.php"); za Windows sisteme (X: črka diska) in števec bo deloval.
Nahaja se v ukazu: getenv("DOCUMENT_ROOT");. Dodajte le še podmape do števca.