Ajattelin kerrankin tehdä sivuille itse oman kävijälaskurin, enkä tyytyä valmiiseen tarjontaan.
Ehdein väsätä alun, joka laskee uniikit ja sivunlataukset, mutta ottaa mukaan palvelimen sivulatauksia. Aloin ihmettelemään, miksi tietokantaan tulee "::1" tyylisiä ip-osoitteita. Ja sain selville lisäämällä hostin tallettamisen, että kyseessä oli itse palvelinohjelma Apache2. Päädyin tekemään purkan, että jos kantaan tarjottiin kyseistä ip:tä, niin kaikki laskurin tietokantakyselyt ohitetaan.
Tämä purkka toimi vähän aikaa, mutta pian tuli uusi ongelma. Apachen pirulainen tuli tietokantaan ip:llä 127.0.0.1, jotenka päädyin tekemään toisen purkan.
Pohjustuksen jälkeen kysyisinkin, onko vika tavassani ottaa talteen tietoja, vai onko vika apachessa.
Kävijälaskurin "kerääväosa":
<?php // Kävijälaskuri // // Kerätään tietoja kävijästä $ip = $_SERVER['REMOTE_ADDR']; $host = $_SERVER['HTTP_USER_AGENT']; $referer = $_SERVER['HTTP_REFERER']; if ($ip == "::1" OR $ip == "127.0.0.1") { } else { $haku = db_query("SELECT * FROM kavijat WHERE ip = ". db_escape($ip)); $aika = time(); switch(mysql_numrows($haku)) { case 0: { db_query("INSERT INTO kavijat (ip, referer, latauksia, viime_lataus, host) VALUE (". db_escape($ip) .", ". db_escape($referer) .", 1, ". $aika .", ". db_escape($host) .")"); break; } case 1: { db_query("UPDATE kavijat SET latauksia = latauksia + 1, viime_lataus = ". $aika .", host = ". db_escape($host) ." WHERE ip = ". db_escape($ip)); break; } } } ?>
edit. Modit, korjatkaa yhdyssanavirhe aiheesta. Olisi kätevää, jos sitä saisi muokata itse jälkeenpäin.
Ei kai se Apache omia sivujaan lataile? :o Katsopa vielä, mitä User-Agent sanoo.
Aivan, samalla rivillä missä on ip:nä on 127.0.0.1 User-Angentina Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6 (internal dummy connection).
Pikaisella Googletuksella selvisi, että asialla on Apachen sisäinen signaalijärjestelmä. Ohjeeksi annettiin, että tarkista Apachen asetuksista kohdat MinSpareServers ja MaxSpareServers, joista jälkimmäisen pitäisi luonnollisesti olla ensimmäistä suurempi. Ratkaisuksi mainittiin myös MPM:n vaihtaminen preforkista workeriksi. http://www.google.fr/search?q=Apache "internal dummy connection"
Aihe on jo aika vanha, joten et voi enää vastata siihen.