Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Käviälaskuri + käviöiden seurantajärjestelmä

Sahrah [20.03.2009 08:31:15]

#

Tämä scripti ottaa talteen sivuilla käyneiden kaikki tekemät pyynnöt ja referrerit käviälaskuri toimii mysql:ällä tekstitiedostoon laitetaan kaikki pyynnöt.

Näyttää myös:

- Sivut joille tehty eniten pyyntöjä
- Eniten pyyntöjä tehneet IP:t
- Uusimmat sivupyynnöt
- Käviälaskuri

Ei luonnollisesti näytä esim. ladattuja tiedostoja tai kuvia jotka on haettu, sen puolesta tämä on parempi kuin apachen loki.

Sopii myös niille, joilla on sivut ulkopuolisen palvelimella, koska harvemmin siellä pääsee apache lokia selaamaan :)

talteenottaja.php

Tämä tiedosto includetaan jokaiseen sivustolla olevaan php tiedostoon. Esimerkiksi voidaan sisällyttää valikkotiedostoon jolloin se automaattisesti tulee joka sivulle käyttöön taikka sitten voidaan pasteta koodi suoraan sinne.

Koodipätkän suorittamisen jälkeen on $tulos - muuttujassa on  lukema sivuilla käynneistä IP:istä, kuten koodista käy ilmi :)

<?php
/*
TAULUN TEKO:

CREATE TABLE kavialaskuri (
ip VARCHAR(19) NOT NULL,
aika DATETIME NOT NULL,
referer VARCHAR(500) DEFAULT NULL,
host VARCHAR(150) DEFAULT NULL
);
*/
//mysql yhistykset
mysql_connect('localhost', 'perke', 'salasanakampelakala');
mysql_select_db('tieto kanta');

$u = 'kaviatiedot'; //tuohon tulee pyynnöt, pitää olla kirjoitus oikeudet

$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); //minä olen vainoharhainen
$k = mysql_query("SELECT COUNT(ip) FROM kavialaskuri WHERE ip = '$ip' UNION SELECT COUNT(*) FROM kavialaskuri");

if (mysql_result($k, 0, 0) == 0) {
	mysql_query("INSERT INTO kavialaskuri (ip, aika, referer, host) VALUES ('$ip', NOW(), '".mysql_real_escape_string($_SERVER['HTTP_REFERER'])."', '".mysql_real_escape_string(gethostbyaddr($ip))."')");
}

$tulos = mysql_result($k, 1, 0);

mysql_close();

$f = fopen($u, "a");
//pistetään tiedosto lukkoon ja jos sitä ei voida lukita nukutaan hetki ja yritetään sitten, ettei vaan pääse käviätiedosto tyhjenemää
while (1) {
	if (flock($f, 2)) {
		fwrite($f, "$ip|".date("d.n.Y G:i")."|".$_SERVER['REQUEST_URI']."|$referer|".$_SERVER['REQUEST_METHOD']."\n");
		flock($f, LOCK_UN);
		break;
	}
	usleep(400);
}
fclose($f);

selaaja.php

Tästä tiedostosta voidaan selata niitä IP:itä :)

<?php

mysql_connect('localhost', 'perkel', 'salasana');
mysql_select_db('toietpka');

//Käviätieto tiedosto
$u = 'kaviatiedosto';


// JOS saadaan GET istä ip
if (isset($_GET['ip'])) {
	$ip = $_GET['ip'];
	$ip = mysql_real_escape_string($ip);
	// haetaan IP:n tiedot mysqllästä
	$kysely = mysql_query("SELECT ip, DATE_FORMAT(aika, '%e.%c.%Y %H:%i') as aika, referer, host FROM kavialaskuri WHERE ip = '$ip'") or die(mysql_error());

	$eka_kerta = @mysql_result($kysely, 0, 1);
	$eka_referer = @mysql_result($kysely, 0, 2);
	$hosti = @mysql_result($kysely, 0, 3);
	$yht = 0;
	$p = strlen($ip);
	if ($eka_kerta == NULL) {
		echo "Osoitetta $ip ei löydy!";
		exit;
	}

	echo "<p><b>$ip</b> <span style='color: red;'>$hosti</span> tavattiin ensimäisen kerran täällä <b>$eka_kerta</b>, hän tuli osoitteesta: <a href=\"$eka_referer\">$eka_referer</a></p>\n\n";
	echo "<table>\n\n";
	echo "<tr><td><b>Aika</b></td><td><b>Pyydetty sivu</b></td><td><b>Referer</b></td></tr>\n\n";
	echo "<h2><a href=\"http://$ip\">http://$ip</a></h2>\n";
	echo "<p><a href=\"?\">Takaisin alkuun</a></p>\n";

	$f = fopen($u, "r");

	// ja nyt aletaan silmukoimaan tiedostoa ja katsotaan millä rivillä on pyyntö kyseiseltä IP:ltä
	//Tuohon silmukkaan kaipaisin optimointivinkkejä :) Sehän pyörähtää niin monta kertaa kun tiedostossa rivejä on
	// itselläni on tällähetkellä vähän reilut 6megan kokoinen tiedosto, ei se paljoa ole hidastunu mutta kyllä vähän
	//Tämä tietysti vaikuttaa vain IPiden selaamiseen, ei mitenkään sivun latautumiseen asiakkaan kannalta :)
	while ($u=fgets($f)) {
		if (substr($u,0,$p)==$ip) {
			$u = trim($u);
			$halki = explode('|', $u);
			$yht++;
			echo "<tr><td>$halki[1]</td><td>$halki[4] <a href=\"$halki[2]\">$halki[2]</a></td><td><a href=\"$halki[3]\">$halki[3]</a></td></tr>\n";
		}
	}
	fclose($f);

	echo "</table>\n\n";
	echo "<h2>Yhteensä $yht sivupyyntöä tältä osoitteelta</h2>\n";
}
// jos halutaan nähdä eniten pyyntöjä tehneet IP:t
elseif (isset($_GET['suurimmat'])) {
	$f = fopen($u, 'r');

	while (!feof($f)) {
		list($ip, $aika, $sivu) = explode('|', fgets($f));
		$taulu[$ip]++;
	}
	fclose($f);
	arsort($taulu);
	while ($maara = current($taulu)) {
		$ip = key($taulu);
		echo "<a href=\"?ip=$ip\">$ip</a> $maara<br />\n";
		next($taulu);
	}
}
// jos halutaan nähä suosituimmat sivut
elseif (isset($_GET['sivut'])) {
	$f = fopen($u, 'r');


	while(!feof($f)) {
		$ka = explode('|', fgets($f));
		$taulu[$ka[2]]++;
	}
	fclose($f);
	arsort($taulu);

	echo "<table>\n";
	echo "<tr><td><b>Sivu</b></td><td><b>Latausmäärä</b></td></tr>\n";
	while ($jukka = current($taulu)) {
		$sivu = substr(key($taulu), 0, 70); //tämähän näyttää koko REQUEST URIN ja jos se on pitkä se laittaa listauksen päin helvettiä, joten lyhenetää sitä vähän
		echo "<tr><td><a href=\"$sivu\">$sivu</a></td><td>$jukka</td></tr>\n";
		next($taulu);
	}
	echo "</table>\n";
}
// ja tämä näyttää 500 uusinta sivupyyntöä
elseif (isset($_GET['uudet'])) {
	echo "<pre>";
	$t = 500;

	$f = fopen($u, 'r');
	fseek($f, -1, SEEK_END); //mennään tiedoston loppuun -1

	//luetaan tiedostoa merkki kerrallaan lopusta alkuunpäin, tehdään niin kauan kunnes tulee false (tiedosto loppuu kesken) taikka on jo luettu 500 riviä
	while (false !== ($c = fgetc($f)) && $i < $t) {
		fseek($f, -2, SEEK_CUR); //siirretään osoitinta alkua kohti kaksi, lukeminen siirtää sitä yhdellä ja jotta edellisen lukeminen onnistuu pitää siirtää vielä toinenkin
		if ($c == "\n") { //jos luettu merkki on rivivaihto, ollaan saatu rivi luetuksi ja voidaa pilkkoa
			$m = explode('|', strrev($rivi)); //se on tietysti takaperin kun on lopusta alkuun luettu, eli käännetään ympäri
			echo "<a href=\"?ip=$m[0]\">$m[0]</a>	$m[1]	<a href=\"$m[2]\">$m[2]</a>\n";
			$i++;
		}
		$rivi .= $c;
	}
	fclose($f);
}
//ellei mitään haluta nähä näytetään uusimmat IP:t
else {
	$kysely = mysql_query("SELECT ip, aika, referer, host FROM kavialaskuri ORDER BY aika DESC LIMIT 150") or die(mysql_error());

	echo "<table border=\"1\">\n\n";
	echo "<tr><td><b>IP</b></td><td width=\"500\"><b>Aika</b></td><td><b>Referer</b></td></tr>\n\n";
	while ($hak = mysql_fetch_assoc($kysely)) {
		echo "<tr><td><a href=\"?ip=$hak[ip]\">$hak[ip]</a><br />$hak[host]</td><td width=\"800\">$hak[aika]</td><td><a href=\"$hak[referer]\">$hak[referer]</a></td></tr>\n";
	}
	echo "</table>\n\n";
}
mysql_close();

Vastaus

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

Tietoa sivustosta