<?php //////// // "Uniikkilaskuri isältä pojalle", by T.M. www.HC-Codes.net // Levitä vapaasti, kunhan et poista nimeäni, tai sivujeni osoitetta // //Ohjeet: //- Tallenna laskurin koodi tiedostoon: "unilaskin.php" //- Laita kyseinen tiedosto sivujesi juureen //- Luo juureen hakemisto: "unilaskin" //- Luo yllä olevan hakemiston sisälle hakemisto: "yht" //- Anna molemmille hakemistoille 777 CHMOD-oikeudet //- Liitä tämä scripti sivuillesi include() funktioita apuna käyttäen: // include("unilaskin.php"); (älä unohda <?php tageja) // // Alkuperäinen koodi: // https://www.ohjelmointiputka.net/koodivinkit/24450-php-uniikkilaskuri-is%C3%A4lt%C3%A4-pojalle //////// // Poistaa tiedostonimelle vaaralliset merkit: function ip_wrap_string($text){ $merkit = "0123456789., "; for($u = 0; $u <= strlen($text); $u++){ if(@strstr($merkit, $text[$u])) $ulos .= $text[$u]; } return trim($ulos); } $ip = $_SERVER['REMOTE_ADDR']; $filename = @ip_wrap_string($ip); if($filename == "") $filename = "tuntematon"; $tiedosto = "unilaskin/".$filename.".txt"; $yht_hak = "unilaskin/yht/"; // Tarkistetaan onko käyttäjän IP jo tallennettu: if(@file_get_contents($tiedosto) == ""){ // "Uniikkilaskuri isältä pojalle", by T.M. www.HC-Codes.net // Tiedot kävijätiedostoon: // aika, hosti, edellinen osoite, nykyinen osoite, selaintiedot // Vaikka onkin turhaa tietoa, voi näistä ehkä jotain statistiikkaakin muodostaa $aika = time(); $host = @gethostbyaddr($ip); $prev = rawurlencode($_SERVER['HTTP_REFERER']); $nyky = rawurlencode($_SERVER['SCRIPT_URI']); $agent = rawurlencode($_SERVER['HTTP_USER_AGENT']); // Luodaan uniikin kävijän tiedosto, ^ yllä olevilla tiedoilla: $filu = fopen("$tiedosto", "w"); fwrite($filu, "$aika|$ip|$host|$prev|$nyky|$agent|"); fclose($filu); // Etsitään tiedosto jonka nimeen kirjoitetaan kävijämäärä: // Palauttaa yksisoluisen taulukon, jossa on tiedoston nimi $hak = @glob($yht_hak."*.txt"); // Jos uniikkilaskuritiedostoa ei ole... if(!$hak[0]){ // ...luodaan uniikkilaskuritiedosto: $findhak = $yht_hak."0.txt"; $filu = fopen($findhak, "w"); fwrite($filu, time()); // Tallennetaan aika koska laskuri käynnistettiin fclose($filu); $hak[0] = "$findhak"; } // Uniikin kävijän lisäys tiedoston nimeen: $plus = (int)basename($hak[0], ".txt")+1; $newhak = $yht_hak."{$plus}.txt"; @rename($hak[0], $newhak); } $hak = @glob($yht_hak."*.txt"); $start = date("j.n.Y", file_get_contents($hak[0])); $yht = (int)basename($hak[0], ".txt"); print"$yht uniikkia kävijää<br>"; print"Laskuri käynnistettiin $start<br>"; ?>
On todella hyvä laskuri :D
no tämähän on kätevä ;)
IP:n perusteella tapahtuva tunnistus ei tietenkään kerro täysin tarkasti erillisten kävijöiden määrää, mutta en kyllä tiedä parempaakaan tapaa. Oman tiedoston luominen jokaisesta IP-numerosta vie muuten aika paljon tilaa palvelimelta...
Erittäin varma uniikkilaskinhan tuo on, mutta sen pullonkaulaksi muodostuu tosiaan tuo tiedostojen viemä tila. Laskeskelin että 5000 kävijää vie tilaa jo lähes yhden megabitin.
Juu, ISO miinus siitä, että laskee vain uniikit kävijät. Itseäni ainakin kiinnostaa myös sellainen tieto, että käykö joku vieras useamminkin kuin vain kerran(siis esim. useampina päivinä) Eli vain "istunnot" uniikeiksi, ei IP-osoitteet. Istunnon pituuden jokainen voi itse määrittää. Ihan vinkkinä vain jos omistaa myslin, niin kannattaa tutustua myös tähän
onko 777 chmod aivan tarpeellinen..
miksi kaikki on erillisissä tiedostoissa, yksikin riittäisi.
BlueByte: kun PHP:llä on tapana nollata filuja jos samaan tiedostoon koittaa kirjottaa monta tyyppiä samaan aikaan. Silmiä saa käyttää myös lukemiseen.
Jos tiedostojen koko käy kalliiksi, niin nuo ylimääräiset tiedot voi jättää tallentamatta noihin tiedostoihin.
Tällöin 5000 kävijää veisi noin ~50kt
Eli rivi (54):
fwrite($filu, "$aika|$ip|$host|$prev|$nyky|$agent|");
Muotoon:
fwrite($filu, "1");
Niin ja tosiaankin jos käytössänne on mysli, niin älkää tätä käyttäkö :)
Tämä laskuri on tarkoitettu vain niille, joilta ei tuota herkkua löydy.
Vaikka tiedoston todellinen koko olisi vain muutama tavu, se kuitenkin vie palvelimella tilaa yhden klusterin verran. Tämän takia tilaa menee paljon hukkaan, jos hakemistossa on suuri määrä pieniä tiedostoja.
Eräässä hakemistossani esimerkiksi on 768 tiedostoa, joiden kunkin koko on sadan tavun luokkaa. Tiedostojen yhteiskoko on 117 kilotavua, mutta palvelimella ne vievät tilaa 1,5 megatavua. Tästä voidaan päätellä, että klusterin (eli samalla pienimmän tiedoston) koko on 1,5 Mt / 768 = 2048 t.
Tuota vähän muistelinkin, että tiedosto vie aina vähintään tietyn verran tilaa. En kyllä uskonut että se veisi 2kt...
No mulla flock kyllä yleensä toimii... ja mysli löytyy sitte omalta servulta kun sen jaksaa pystyttää :)
lainaus:
Muotoon:
fwrite($filu, "1");
fwrite rivi kokonaan pois niin vie huomattavasti vähemmän tilaa, koska silloin ei varata yhtä varausyksikköä. Hmm.. entäs kun sulla on 10 000 tiedostoa jotka kaikki on 0 Kt ;)
Parempi versio: https://www.ohjelmointiputka.net/koodivinkit/
Olin väärässä! "a" moodilla ei voikaan tyhjentää tiedostoa, joten tämä vinkki lienee turha.
- Tämä vinkki on nyt poistettu -
Aihe on jo aika vanha, joten et voi enää vastata siihen.