Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Uniikkilaskuri isältä pojalle

Sivun loppuun

T.M. [01.08.2004 01:52:50]

#

<?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>";


?>

Darkest-0 [01.08.2004 02:04:01]

#

On todella hyvä laskuri :D

makeuu [01.08.2004 12:36:49]

#

no tämähän on kätevä ;)

Antti Laaksonen [01.08.2004 12:37:25]

#

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...

Tempfile [01.08.2004 13:09:59]

#

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.

ajv [01.08.2004 13:19:26]

#

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

BlueByte [01.08.2004 13:47:58]

#

onko 777 chmod aivan tarpeellinen..

BlueByte [01.08.2004 13:49:19]

#

miksi kaikki on erillisissä tiedostoissa, yksikin riittäisi.

Matti Kaijomaa [01.08.2004 15:43:33]

#

BlueByte: kun PHP:llä on tapana nollata filuja jos samaan tiedostoon koittaa kirjottaa monta tyyppiä samaan aikaan. Silmiä saa käyttää myös lukemiseen.

T.M. [01.08.2004 16:41:17]

#

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.

Antti Laaksonen [01.08.2004 17:30:54]

#

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.

T.M. [01.08.2004 17:36:41]

#

Tuota vähän muistelinkin, että tiedosto vie aina vähintään tietyn verran tilaa. En kyllä uskonut että se veisi 2kt...

sooda [02.08.2004 18:37:24]

#

No mulla flock kyllä yleensä toimii... ja mysli löytyy sitte omalta servulta kun sen jaksaa pystyttää :)

Meitzi [03.08.2004 19:05:25]

#

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

T.M. [26.09.2004 03:55:32]

#

Parempi versio: https://www.ohjelmointiputka.net/koodivinkit/24521-php-monipuolinen-kävijälaskuri

Olin väärässä! "a" moodilla ei voikaan tyhjentää tiedostoa, joten tämä vinkki lienee turha.

- Tämä vinkki on nyt poistettu -


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta