Archief - PHP: goede teller maken

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

horse_99

Legacy Member
Hallo allemaal,

Hoe maak ik (theoretisch) een goede PHP teller, dus een teller die het aantal bezoekers telt.

Waar werk ik het beste mee?

- sessions: is misschien het gemakkelijkste, maar als de gebruiker de browser afsluit en terug naar de website surft, wordt het bezoekersaantal geïncrementeerd (correct me if I'm wrong, want ik heb nog niet veel ervaring met sessions);

- IP: ieder IP-adres van een bezoeker in een database steken mét de datum van het bezoek. Als het script wordt uitgevoerd, wordt er eerst nagekeken of er al IP's met datums instaan van gisteren (deze worden dan verwijderd), daarna pas wordt het IP-adres van tijdens het bezoek er in opgeslagen en tijdens dit inserten, wordt er een veld geïncrementeerd dat het aantal bezoeken representeert.

Dit zijn nog maar mijn speculaties over een teller. Heeft iemand een beter idee?

Bedankt voor alle reacties! :bow:

Squall-sX-

Legacy Member
Zelf zou ik IP's kiezen.
- Geen veld incrementeren
- Niks verwijderen uit de tabel
- Ip's toevoegen als ze niet van de laatste 24 uur al in je tabel staan
- Het aantal bezoekers is rowcount van je tabel.

Yngwie

Legacy Member
Squall-sX- zei:
Zelf zou ik IP's kiezen.
- Geen veld incrementeren
- Niks verwijderen uit de tabel
- Ip's toevoegen als ze niet van de laatste 24 uur al in je tabel staan
- Het aantal bezoekers is rowcount van je tabel.

zo zou ik het ook doen, en terwijl je dan toch bezig bent met ip's en date's op te slaan in de db kan je evengoed de referral link mee opslaan, zo weet je met één query in je admin panel ook meteen vanwaar al je bezoekers komen of dat ze zelf de url ingetypt hebben.

Cakeman

Legacy Member
Ik ben al een tijdje niet meer met PHP bezig, maar is/was met IP's werken niet tricky omdat je in sommige gevallen het IP van de proxy server krijgt?

Lashknife

Legacy Member
de forward via een loop opvragen tot die niet meer ingevuld is en dan het remote address opvragen, op die manier ga je door allle proxies heen

Mulle

Legacy Member
Yngwie zei:
zo zou ik het ook doen, en terwijl je dan toch bezig bent met ip's en date's op te slaan in de db kan je evengoed de referral link mee opslaan, zo weet je met één query in je admin panel ook meteen vanwaar al je bezoekers komen of dat ze zelf de url ingetypt hebben.

Als je dan toch bezig bent, kan je ook nog de volgende zaken opslaan. Browser, Land van herkomst, welk os dat ze de bezoeker gebruikt, aantal opgevraagde pagina's, ... .

Ik weet niet of het wel een goed idee is om telkens die tabel aan te vullen op unieke bezoeker per dag. Ik doe dit ook wel, maar als er meer dan 100000 resulaten inzitten, begint toch alles wat trager te lopen.
Ik los het nu anders op door op middernacht (cronjob) een script te laten runnen die de gegevens mooi sorteert in andere tabellen (browser, land, referer,...) van de dag ervoor en daarna alle records wist van die dag.

zero2one

Legacy Member
Mulle zei:
Als je dan toch bezig bent, kan je ook nog de volgende zaken opslaan. Browser, Land van herkomst, welk os dat ze de bezoeker gebruikt, aantal opgevraagde pagina's, ... .

en daarvoor kan je mischien PHPsniff gebruiken

btw: als je verschillende bezoekers krijgt van achter 1 en dezelfde NAT router (vanuit bedrijven, homenetwerken) zal je maar 1 ip zien!!
een combinatie van ip en session lijkt mij beter...

Mulle

Legacy Member
zero2one zei:
en daarvoor kan je mischien PHPsniff gebruiken

btw: als je verschillende bezoekers krijgt van achter 1 en dezelfde NAT router (vanuit bedrijven, homenetwerken) zal je maar 1 ip zien!!
een combinatie van ip en session lijkt mij beter...

Volgens mij zal dit niet lukken met sessions. Als men de browser sluit en terug komt naar die site vervalt de session en wordt deze terug als nieuwe bezoeker weergegeven. Het kan wel lukken met cookies, maar niet iedereen laat cookies toe. Daarom dat ik ze meetal als aantal hits.

servi

Legacy Member
Ik ben al een tijdje niet meer met PHP bezig, maar is/was met IP's werken niet tricky omdat je in sommige gevallen het IP van de proxy server krijgt?

Niet als je een beetje oplet, dan gaat dit wel, met volgende functie moet het wel lukken :

PHP:
<?php

function getIp() {
	if ( isset($HTTP_X_FORWARDED_FOR) ) {
		return $HTTP_X_FORWARDED_FOR;
	} else if ( isset($HTTP_PROXY_USER) ) {
		return $HTTP_PROXY_USER
  	} else if ( isset($REMOTE_ADDR) ) {
		return	$REMOTE_ADDR;
	} else {
		return $_SERVER['REMOTE_ADDR'];
   }
}
?>

Mulle

Legacy Member
servi zei:
Ik ben al een tijdje niet meer met PHP bezig, maar is/was met IP's werken niet tricky omdat je in sommige gevallen het IP van de proxy server krijgt?

Niet als je een beetje oplet, dan gaat dit wel, met volgende functie moet het wel lukken :

PHP:
<?php

function getIp() {
	if ( isset($HTTP_X_FORWARDED_FOR) ) {
		return $HTTP_X_FORWARDED_FOR;
	} else if ( isset($HTTP_PROXY_USER) ) {
		return $HTTP_PROXY_USER
  	} else if ( isset($REMOTE_ADDR) ) {
		return	$REMOTE_ADDR;
	} else {
		return $_SERVER['REMOTE_ADDR'];
   }
}
?>

Ik gebruik het volgende (is niet van mij geweest):
PHP:
<? 
function get_ip(){ 
    if(isset($_SERVER['HTTP_CLIENT_IP'])){ 
        $ip = $_SERVER['HTTP_CLIENT_IP']; 
    }
    else{ 
        if(getenv('HTTP_X_FORWARDED_FOR')){ 
            $ip = getenv('REMOTE_ADDR'); 
                if(preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", getenv('HTTP_X_FORWARDED_FOR'), $ip3)){ 
                    $ip2 = array('/^0\./', '/^127\.0\.0\.1/', '/^192\.168\..*/', '/^172\.16\..*/', '/^10..*/', '/^224..*/', '/^240..*/'); 
                    $ip = preg_replace($ip2, $ip, $ip3[1]); 
                } 
            }
            else{ 
                $ip = getenv('REMOTE_ADDR'); 
            } 
        if($ip == "") 
            $ip = "x.x.x.x"; 
    } 
    return $ip; 
} 
?>

horse_99

Legacy Member
Ik heb net beide scripts getest.

Lokaal geven ze beiden: 127.0.0.1, en
Online (op mijn webspace bij mijn host) geven ze beiden: 80.192.20.60, hetzelfde

Dit is wel een heel ander IP adres dan mijn lokaal IP adres. Is dit dan het IP adres van je ISP dat het script terug geeft?

MVG, Kristof.

Bedankt voor alle reacties! :bow:

Mulle

Legacy Member
horse_99 zei:
Ik heb net beide scripts getest.

Lokaal geven ze beiden: 127.0.0.1, en
Online (op mijn webspace bij mijn host) geven ze beiden: 80.192.20.60, hetzelfde

Dit is wel een heel ander IP adres dan mijn lokaal IP adres. Is dit dan het IP adres van je ISP dat het script terug geeft?

MVG, Kristof.

Bedankt voor alle reacties! :bow:

Het script dat je lokaal draait zal altijd 127.0.0.1 weergeven en niet je echt ip waarmee je aan het internet bent gekoppeld. Dus alles is volkomen normaal. Als je zeker wilt weten dat je ip (script niet lokaal draaien) klopt, controleer eens je ip van je pc. Dit kan je zo doen: Start->Uitvoeren->Typ "cmd"->Typ daarna "ipconfig" Kijk wat er dan bij IP-adres staat. Normaal zou dit 80.192.20.60 moeten zijn als je rechtstreeks verbonden bent met het internet.
Opmerking: 80.192.20.60 dit kan ook een ander zijn als je ip dynamisch is. Dus controleer de ip dat je krijgt op je webspace en die van je pc.

TheCrow7

Legacy Member
Ik snap de reden niet van dit in een database te zetten eigenlijk. Dit is zo typisch uit het PHP/MySQL wereldje van de onozelste futuliteit in een database te proppen.

What's wrong with the good 'ole plain text file ?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan