Luister, even voor de duidelijkheid, de helft van mij 4k posts zijn idd spam dus daar hoeven jullie al niet over te discussiëren. De andere helft staat vol met spelfouten en grammatica fouten dus eigenlijk zou mijn postcount 0 zijn. BOIET MIJ GEEN HOL, dit is maar een forum waar ik af en toe wat op brabbel. Dus @Karl, t slaat ook nergens op en dat weet ik en jij weet dat ik dat weet.
Maar terug naar waar we het over hadden. Ik heb twee botjes gemaakt, één botje zoekt eerst alle topics op. Je geeft zelf even het id van alle forums dat je wilt crawlen en dan gooit hij alle topics (titel + id) in m'n db. Ik vond 49k topics excl. admin only topics, koffiehoek en natuurlijk verwijderde topics. Dan heb ik nog een tweede botje geschreven dat telkens 200 topics (dus het id + forum) uit m'n db leest die ik net gevonden heb met m'n andere botje. Hij gaat ieder topic af en haalt alle berichten van de eerste pagina, als er 20 berichten op die pagina staat probeert hij nog een tweede pagina, als die leeg is gooit hij alle berichten in een multidimensionale array en gaat door met een volgend topic. Als er berichten op die tweede pagina staan .. etc. Zo komt er dus eigenlijk een oneindige lus voor ieder topic tot alle berichten uit ieder topic van die 200 topics opgehaald zijn. Alle berichten die in die ene array zitten worden in één query in m'n db gezet. Daarna worden de volgende 200 topics uit m'n db gehaald en begint de hele lus weer opnieuw. Waarom zou ik dan als dit zo gaat niet iedere x ms een nieuwe pagina met berichten op kunnen vragen? Hoe zou ik het anders doen? Hoe doet Google dat dan? Iedere dag een pagina? Nee, Google haalt een pagina op, haalt vervolgens weer alle pagina's op waarnaar wordt gelinkt op die ene pagina en gaat zo door, dan verstuurt de crawler een berg pagina's naar een ander botje dat alles verwerkt en de data ordent. Een moderne server kan daar makkelijk tegen.
Over die tijden die ik zou overdrijven: zo'n botje schrijven dat is echt een paar minuten werk als je weet hoe zoiets moet. Het is gewoon een simpel PHP scriptje dat eigenlijk bestaat uit een db connectie en één grote loop. Het moeilijkste was nog dat Bas in der tijd zo leuk was om tabellen te gebruiken en dan ook nog eens ze geen fatsoenlijke class/id te geven, daardoor werd ik even opgehouden bij het schrijven van de botjes. Ik gaf gewoon een command: "php bot-topics.php 1" via SSH, 1 hierin is het forum dat doorzocht moet worden en de rest kunnen jullie zelf wel uitvogelen.
Over die paar regels, ik kan wel voor ieder topic dat ik doorzocht/gevonden heb een bericht terugsturen naar de client, ten eerste heeft de client daar niets/niet veel aan en ten tweede kost tijd ook tijd en bij zo'n hoeveelheid dus ook dataverkeer etc.. Voor de geinteresseerde, ik zal hier het botje posten dat ik heb geschreven voor het ophalen van de topics. Wel op voorwaarde dat jullie niet het zullen gebruiken hier op PHP Hulp maar alleen om van te leren of weet ik wat. Want als nou ineens 10 mensen dat tegelijkertijd gaan uitvoeren hebben misschien andere gebruikers er last van.
Ik weet dat het slordig is met mysql_*, maar het werkt, snel en duidelijk. Ik heb even $_GET['forum'] gebruikt zodat sommige onder jullie misschien snappen waar die variabele voor nodig is, eerst gebruikte ik dus de C-style arguments ($_SERVER['argc'][0]) voor. Nogmaals, je ziet dat ik een aantal lussen doe die uiteindelijk voor 49k topics dus heel vaak herhaald worden, om dan iedere keer een bericht te sturen is zo onnodig en alleen maar irritant uiteindelijk. Oh btw, zoals je ziet moet je wel voor ieder forum ook even kijken hoeveel pagina's met topics er zijn want dat heb ik niet ingebouwd, een automatische check hoeveel pagina's er zijn.
Edit: heb ik me genoeg verantwoord?
Omdat dus idd alle topics gewoon beschikbaar blijven zal ik geen archief online zetten.
@pepijn, dit is werkelijk helemaal belachelijk. Je gaat een topic bumpen van 2 jaar geleden waarin er een bug wordt besproken die al lang weer opgelost is...
En mochten een van deze mensen moderator zijn dan zie je bij hun naam 'moderator'.