Oke oke oke... Zal ik dan maar niet zo kinderachtig zijn en maar laten zien waar ik mee bezig ben? Kunnen anderen ook ideeën krijgen enzo.. Je bent de tweede die het vraagt (ook in
dir draadje), en ik heb nu zoiets van what the heck.
Ik ben een DPC logfile parser aan het maken. Die zijn er toch al? Jawel, maar niet realtime, en daar ben ik dus mee bezig
Logfile wordt bijgewerkt door de proxy. Die kan een hourly, daily, weekly, monthly, yearly of geen logrotation hebben. Stukkie logfile:
code:
1
2
3
4
5
| 2001-04-15 19:09:06,212.120.110.212,dpc_viedz@hotmail.com,2420c56c60000000,294,1,1,8010
2001-04-15 21:30:41,213.75.7.21,dpc_viedz@hotmail.com,2245c18d00000000,12,1,1,8010
2001-04-15 23:24:37,213.10.120.13,dpc_viedz@hotmail.com,22a88e53f0000000,809,1,1,8010
2001-04-15 23:44:43,192.168.0.2,dpc_viedz@hotmail.com,208db57f70000000,487,4,1,8010
2001-04-15 23:53:35,212.204.142.202,dpc_viedz@hotmail.com,23d614f580000000,603,1,1,8010 |
Van links naar rechts: Datum, IP, email, code, units (aka blocks), OS, CPU en version.
De stats die gegeven gaan worden: By email, OS, CPU, Version, Full detail (dus OS, CPU en Version), én: byhost. Dat werktte al een tijd (lees een half jaar), maar meer en mensen begonnen te flushen, en de update-byhost combinatie duurde veel te lang om te laden. 30 seconde gemiddeld!!
Dat lange laden lag eraan dat ik in de database geen ID had opgeslagen van degeen die het blokje ingeleverd had. In byhost.php las ik alle data van de laatste 5 dagen in, en ging bij de IP's de namen zoeken. Allemaal wel redelijk geoptimaliseerd de query's, maar niet toen er 50 losse IP's instonden!
Dus, mijn idee was het sneller te maken (doh

). De update moet het ID al in de database zetten als ie aan het updaten is. De vorige update groepeerde alle regels in de log als het IP, datum, OS, CPU en version gelijk was. Vergelijkbaar met striplog voor de intimi

De laatste unieke code die bij een regel gevonden was werd ook opgeslagen. Bij de volgende update keek ik gewoon naar de allerlaatste unieke code in de database, de datum, en opende het logbestand (niet rekening houdend met de verschillende rotations), las elke regel in totdat ie die block-code ergens tegenkwam. Dát was het startpunt om te zoeken.
Ja, da's traag ja

Dus, op advies van iedereen (thanx GoT mainly), sla ik nu de offset en de filename op in de database. Er wordt ge fopend, fseekt, while (fgetcsv)'t, ftellt en de offset geupdated. In het while-loopje van fgetcsv maak ik die multidimentional array aan (zie ook weer
dit draadje), die ervoor zorgt dat er gegroepeerd wordt, door array-keys te vormen adhv de regel uit de logfile en dieper daarin de units op te tellen (en zo units bij bestaande array elements op te tellen, of een nieuw array element te maken als de combo date, ip, email, os, cpu en version nog niet gezien is).
Als alle logfiles doorlopen zijn (dat is het langdurigste deel) heb ik dus een multidimentional array $getid.
$getid[IP][sortkey][0] datetime
$getid[IP][sortkey][1] units
sortkey = YYYYMMDD,email,os,cpu,version
Die dorloop ik met een foreach, en bouw daar een mysql-query van, en die rag ik dan naar de databeest (die duurt niet zo lang, 0,003 seconde

)
Sow.. Nu heb ik wel weer teveel getikt

Nu mogen jullie weer als jullie nog zin hebben. Vraag maar raak, je mag alles van me weten (behalve me pincode en me w8woord

)