Števec obiskov


Uvod

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.

Ideja

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.

Koraki skozi kodo

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:

  • Zapomnite si, da morate na Windows strežnikih pot do datotek podati kot X:\\pot\\do\\mape\\, kjer je X: črka diska. Zelo pomembno je, da so ločniki med imeni map dvojni \\.
  • Datoteki s obiski in IPji sta lahko poljubno poimenovani - lahko sta tudi brez končnice. Pomembno je le, da imata pravilno nastavljena dovoljenja. Nastavite jih na 777.
  • Čas blokade v minutah lahko nastavite tudi kot decimalno število

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 Stevec()

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 file_get_contents() je na voljo šele od PHP 4.3.0 naprej

Funkcija PreveriIP()

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()

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.

Hitre povezave

Uporaba skripte za komercialno uporabo (služenje denarja) je strogo prepovedana!

Izvorna koda

Navodila za uporabo

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.

Kako najti pravo pot?

Nahaja se v ukazu: getenv("DOCUMENT_ROOT");. Dodajte le še podmape do števca.