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();
Aihe on jo aika vanha, joten et voi enää vastata siihen.