![]() |
[Web] website statistieken programmeren
Ik zou graag zelf wat website-statistieken programmeren. Het gaat om enkele simpele dingen hoor: Aantal bezoekers, welke browser, welke schermresolutie, ... Dat soort dingen.
Nu weet ik alleen niet goed hoe ik die data van de bezoekers moet opslaan. Sla je de data van bezoekers gewoon per bezoeker op een de database, en haal je de data eruit als je statistiekenpagina wordt opgevraagd. Berekenen van alles gebeurt dan bij het opvragen van de statistiekenpagina. Of bereken je telkens er een bezoeker langskomt opnieuw alle totalen en sla je die op in de database? Dan moeten ze enkel worden uitgelezen bij het opvragen van de statistiekenpagina. Of sla je zulke dingen helemaal niet op in een database, maar weet ik veel waar ergens anders ? Hoe zou jij daaraan beginnen? thx Ps1. Ik vraag geen code of zo hoor, gewoon een werkwijze. Ps2. Voor de criticasters onder ons, ik weet dat er honderd en één verschillende webstats-sites zijn, die zelfs gratis zijn, maar ik zou het gewoon graag een keertje zelf programmeren. |
Database met daarin de browsers en die hoog je steeds met 1 op.
|
Citaat:
Table user Fields: ip resolution color-depth browser .. .. etc Stel je krijgt een miljoen bezoekers, dan heb je wel een redelijk aantal records :p Stel je gebruikt meerdere tables, denkt na over de verwachte waarden en verhoogt die: table: users_resolution fields: 800x600 1024x768 16..x1200 etc En daarvan verhoog je steeds de waarde met 1. Elk tabel heeft 1 record en blijft er maar 1 houden, omdat elk veld geupdate wordt. Andere mogelijkheden? Denk er zelf maar over na ;] |
Een statistieken pagina wordt minder vaak opgevraagd, dus kun je de berekeningen het beste op dat moment doen.
Verder begin je met het opschrijven van alle gegevens waar je statistieken van wilt (resolutie, browser, etc). Dit gaan normaliseren. Vervolgens heb je een mooie database. Dan de code schrijven. Het aantal records in een tabel maakt op zich weinig uit; een beetje DBMS kan hiermee probleemloos overweg. |
Citaat:
|
De site waarvoor ik nu die statistieken aan het maken ben, zal wel geen tienduizenden bezoekers trekken :)
Maar omdat dit later zal dienen als basis voor statistieken op grotere sites, zou ik het toch wel op een goede manier willen proberen. Het voordeel van alle info per gebruiker (dus in één tabel) op te slagen, is dat je slechts één tabel moet updaten telkens er een nieuwe bezoeker komt je site komt. Wanneer je alles in verschillende tabels (tabel resolutie, tabel browser, ...) opslaagt, moet je per nieuwe gebruiken wel enkele tabellen updaten. Maar dit is dan weer sneller bij het genereren van de statistiekenpagina. Welke van de twee zou nu de beste oplossing zijn en waarom? |
Citaat:
|
Citaat:
Citaat:
Citaat:
Verder zou ik op de tabellen enkele indexen zetten om het genereren van de statistieken te versnellen. Houdt er rekening mee dat het bijwerken van een index ook tijd kost. Tijd die je, wanneer je alles in één tabel zou zetten, niet hebt; het bijwerken neemt dan teveel tijd in beslag. Ook een optie is om het bijwerken van de tabel(len) in een apart proces/aparte thread te doen; zo hoeft de gebruiker niet te wachten totdat de database klaar is met updaten en kan de pagina gewoon doorgaan met laden. |
'k ga niet voor de quick'n dirty methode gaan ;)
Ik ga alles propertjes genormaliseerd proberen te doen. Het bijwerken van de tabellen in een apart proces is nu zeker nog niet nodig, maar ik heb er geen idee van hoe je zoiets kan fixen. Hoe doe je zoiets ? Of naar welke info moet ik zoeken om zoiets te fixen ? Thx anyway !!! |
tabel 1 :
gebruiker IP | eerste keer | per dag | totaal aantal keer | script als eerste keer nee is haal data en stop in database tabel 2 zo niet tel 1 op bij totaal aantal keer. tabel 2: | reso | OS | afkomst? | iets in deze richting moet je gewoon denken, je moet alleen ff uitkijken dat je niet telkens bij iedere nieuwe gebruiker dat elke script weer doorlopen word |
Citaat:
|
Citaat:
Schrijf alle attributen op die je wilt bewaren voor de statistieken (browser, resolutie, ip, etc). Zorg ervoor dat je dit zoveel mogelijk uitkleed; 'browser' is niet specifiek genoeg. Denk o.a. aan: - Naam : 'Opera' - Versie (Major) : 7 - Versie (Minor) : 54 Zo is 'resolutie' ook niet specifiek genoeg; een resolutie bestaat namelijk uit twee gegevens: x-resolutie en y-resolutie (800 x 600, 1280 x 1024, 1600 x 1200). Op deze manier hoef je de resoluties niet voor te definieren (en kun je nog mooiere stats maken). Je bent nu nog in de ontwerp fase: Je gaat bedenken wat en hoe je iets gaat maken. Nadat je het helemaal mooi hebt uitgewerkt, kun je gaan bepalen waarin/waarmee je iets gaat maken. Denk hierbij aan database keuze (Oracle, MS SQL Server, MySQL, plain text) zo ook aan de scripttaal (ASP .NET, Perl, PHP, ColdFusion). Nadat je dit hebt gedaan, ga je beginnen met bouwen en mnoet je je concentreren op de specifieke problemen van de door jou gekozen database + taal. |
Citaat:
Voornamelijk de 'clustered indexes' zijn niet zo fijn voor de database. Bij zo'n index staan de records fysiek op de volgorde aangegeven in de clustered index. Voorbeeldje: Tabel resolutie id - int x - int y - int Er staat een clustered index op x. De records staan dan (fysiek) in de volgende volgorde Code:
id x y Wanneer je nu een nieuwe resolutie gaat toevoegen, zeg 640 x 150, komt het er zo uit te zien Code:
id x y |
clustered index betekent dat er geordend wordt op de waarden van x? Waarom zou je niet gewoon een ordening op de index aanhouden? (Dan heb je dat probleem wat je voorschreef toch niet?)
(waarschijnlijk zal dit de reden zijn waarom ik resoluties er gewoon zelf 'hard coded' in zou zetten, wat iets ten koste gaan van de genericiteit, maarja...) |
Citaat:
Een clustered index is alleen goed te zetten na uitgebreide tests om te kijken welke queries het vaakst voorkomen en/of de meeste tijd in beslag nemen om deze daarna proberen te optimaliseren. Wanner je bijvoorbeeld alle resoluties met x = 640 wilt hebben, hoeft in het geval van een clustered index de leeskop van de harde schijf een stuk minder te bewegen om de data te lezen, omdat de data achter elkaar staat. Dit scheelt (uiteindelijk) weer tijd. Maar hoogst waarschijnlijk helpt dit alleen goed bij alleen lezen applicaties. Bij applicaties die veel bewerkingen veroorzaken op de database kan een clustered index dus voor veel vertraging zorgen (omdat de records steeds fysiek moeten worden verplaatst). Citaat:
[edit] Verder worden gewone indexen ook vanzelf bijgewerkt; anders heb je er niks aan he? (staat er een record in de tabel die niet is opgenomen in de index --> vind je hem nooit ;)) |
Citaat:
Citaat:
|
Citaat:
(excuse my French) |
Citaat:
Maareuh, ik bedoelde eigenlijk hoe je zoiets kan uitvoeren in een tweede bestand, zodat het laden van de pagina's niet wordt vertraagd door het updaten van al die data. Is dat in elke ServerSide programmeertaal mogelijk, of moet je daar een wat grotere programmeertaal bijhalen ? Wat die database betreft, ik dacht aan het volgende: tbl1: ID | IP | aantal visits tbl2: ID | tbl1 ID | browsernaam | versie tbl3: ID | tbl1 ID | resolutieX | resolutieY tbl4: ID | tbl1 ID | hostname | land van herkomst tbl5: ID | dag | maand | jaar | dag vd week | week (enige tabel samen met tbl1 die bij elk bezoek moet worden geupdate) Is dit teveel opgesplitst of in teveel tabellen verdeeld ? Of zit dit toch in de goede richting ? |
Citaat:
Ach ja, ze wordt graag gebruikt ;) |
Wat overigens het beste en snelste is:
Stat image: Schrijft diverse/gewenste data naar 1 file of verschillende files Stat script: Leest 1x per dag (voorkeur: nacht) de bestanden uit en schrijft ze in html formaat direct weg als files. Dit is het snelste en server vriendelijkst. (Sterker nog, statistieken pagina's als Webalizer en AW Stats werken zo ;)) |
Ja, kan je niet gewoon de Apache logs uitlezen?
Wel zo nauwkeurig, en beter qua performance van je website. |
@ ********** en @ manuzhai: Weerom, hoe doe je zoiets.
Ik kan wel wat programmeren, maar van zulke dingen heb ik weinig kaas gegeten. |
Als je de beschikking hebt over die logfiles: kwestie van parsen met bijvoorbeeld Python of PHP of Perl. Is niet zo heel moeilijk.
|
waar draait dit nou om, php en mysQl tog? of heb ik het mis, want de dingen die ik hierboven zie :s :confused:
|
Mja, ik werk met ASP. Nu, ik zit wel op een apache webserver (die draait chilisoft ASP). Waar zou ik die log-files moeten terugvinden ?
|
Citaat:
|
Daar heb ik blijkbaar zo direct geen toegang toe.
Toch bedankt. Andere ideetjes, of heb je er misschien een idee van wat Trilox juist bedoelde ? |
Trilo heeft het over een hybride script, dat eerst alle data zo simpel mogelijk wegschrijft en vervolgens eens in de zoveel tijd die ruwe data verwerkt tot iets dat nuttiger is en minder ruimte inneemt.
|
asp (n) php (y)
|
PHP (n) Python (y)
|
Citaat:
|
|
Citaat:
Python (y) PHP is zeker niet per definitie slecht, Python kan alleen meer. Maar iest wat ook met PHP kan zal in PHP makkelijker te maken zijn en sneller geparsed worden. |
Scripttalen (n)
? :p Ach, tis maar net wat je fijner vindt. Je kan genoeg met de meest gangbare scripttalen. |
Citaat:
Citaat:
Bestand browser.txt bevat: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera/7.54 (Windows NT 5.1; U) [en] Etcetc Dan lees je het bestand gewoon uit en stop je even alles mooi in een array en gaat alles even netjes tellen. En dit doe je ook met dingen als IP's ed. Citaat:
Neem dan gewoon serieus een Windows server met ASP(.NET). |
Citaat:
Citaat:
Over het algemeen zijn attributen die berekend kunnen worden niet nodig in de database (tenzij het extreem veel performance kost). Zoals tabel 5. het enige wat je misschien nodig hebt, is de datum. Van daar uit kun je de dag, maand, jaar, weekdag en week bepalen. De optie die ********** doet is ook een goede. Maar het hangt er vanaf hoe actueel je de statistieken wilt hebben. :) |
Citaat:
|
Alle tijden zijn GMT +1. Het is nu 05:09. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.