Ik ben bezig met een Web-based MMORPG (PHP5 + MySQL). Alleen krijg ik het niet voor elkaar om vertraagd een query uit te voeren.

ik zal even een voorbeeld geven:
een gebouw moet worden gebouwd na 12 minuten (query dus uitvoeren na 12 min). Daarnaast moet je op de pagina up to date blijven (javascript timer?)

maar de vragen zijn dus, hoe voer ik die query vertraagd uit.

enkele functies die mss werken, maar die mij niet lukte.

sleep(), usleep(), time_sleep_until()

ps. hij moet dus ook doorgaan als de gebruiker de pagina verlaat, en hij moet weer ook nog aan het door tellen zijn als de gebruiker weer terugkomt
Tijd bijhouden in de database. Zodra de tijd is verlopen query uitvoeren.
ps. hij moet dus ook doorgaan als de gebruiker de pagina verlaat, en hij moet weer ook nog aan het door tellen zijn als de gebruiker weer terugkomt
Nee, dat wil je niet.

Het is volkomen zinloos om de database aan het werk te zetten wanneer niets of niemand iets met de resultaten doet. Wanneer iemand na een uur terug komt, kijk je gewoon hoeveel tijd er is verstreken en bereken je hoeveel vooruitgang er is geboekt.

Met de functies DATE_DIFF() en TIME_DIFF() kun je dit soort zaken gaan berekenen. Ga je er eens in verdiepen en hou in de gaten dat er geen letter php-code aan te pas komt. Hoofdstuk 12.5 van de MySQL-handleiding is je beste vriend.

Waarschuwing: Met jouw aanpak, queries uitvoeren die niet nodig zijn, loopt de boel hopeloos vast wanneer er veel spelers zijn.
SQL code zou idd de allerbeste oplossing zijn, maar de code moet zeker uitgevoerd worden, ook als ze er niet zijn, want er kunnen andere gebruikers om de data gaan vragen (als ze een aanval uitvoeren bijv). maar is het met die x_DIFF codes mogelijk om serversided uit te stellen ? de client moet namelijk helemaal niets meer kunnen onderbreken.

EDIT: srry zal voortaan eerst lezen en dan replyen. Optie die hierboven staat is goed mogelijk, maar is meer een work-around. het probleem is dus dat er niets gebeurt als de gebruiker een week lang niets doet.
het probleem is dus dat er niets gebeurt als de gebruiker een week lang niets doet.
Nee, dat is geen probleem, dat is juist de bedoeling!

Jij moet er alleen voor zorgen dat op het moment dat de gebruiker wél iets doet, er 1 of meerdere queries worden uitgevoerd die de stand van zaken gaat bijwerken. Een gebruiker heeft bv. 53 uur niet naar zijn account omgekeken. Per uur lidmaatschap krijgt een gebruiker 2 punten toegewezen. Met TIME_DIFF() bereken je het aantal uren, 53, en dat vermeningvuldig je met het aantal punten, 2, e voilá, daar heb je het resultaat: 106.

I.p.v. 53 queries (1x per uur) heb je nu 1 query nodig. Dat scheelt nogal een slok op een borrel.

Je voert een query uit wanneer je de data nodig hebt, wanneer je niks nodig hebt, voer je dus ook niets uit.
Dit werkt idd voor "punten" op welke manier dan ook, maar ik wil dus zegmaar een nieuw record aanmaken in tabel "gebouwen" en dat moet na een bepaalde tijd gebeuren. mss als er iemand om de gebruiker vraagt (dus de gebruiker zelf of een andere gebruiker) dat het dan moet worden gecontroleerd en geupdate/insert ? lijkt me alleen een beetje omslachtig
Anders schrijf je dat nieuwe gebouw 'gelijk' in de database weg en geef je hem een activatietijd mee. Vanaf dat moment is hij actief en dus zichtbaar. Dus je schrijft hem weg met een tijd 12 minuten in de toekomst. Dan ben je ook klaar...
David Festen schreef op 15.01.2007 09:24
Dit werkt idd voor "punten" op welke manier dan ook, maar ik wil dus zegmaar een nieuw record aanmaken in tabel "gebouwen" en dat moet na een bepaalde tijd gebeuren. mss als er iemand om de gebruiker vraagt (dus de gebruiker zelf of een andere gebruiker) dat het dan moet worden gecontroleerd en geupdate/insert ? lijkt me alleen een beetje omslachtig


Het is wel de goede oplossing, het scheelt je uiteindelijk behoorlijk als je niet elk uur de data wegschrijft. Als iemand de data opvraagt, dan ga je het bijwerken, niet eerder.
Kijk eens naar de ontwikkelings versie (5.1 dacht ik) van MySQL. Hierin heb je events (zelfde principe als cronjobs(Linux) of geplande taken(Windows)). Alleen heb ik nog niet gezien dat je systeem commando's kunt uitvoeren.
Martijn! schreef op 15.01.2007 11:02
Kijk eens naar de ontwikkelings versie (5.1 dacht ik) van MySQL. Hierin heb je events (zelfde principe als cronjobs(Linux) of geplande taken(Windows)). Alleen heb ik nog niet gezien dat je systeem commando's kunt uitvoeren.
Het is al meerdere keren gezegd, maar dit wil je niet! Het is volkomen zinloos om een query uit te voeren wanneer niemand iets met het resultaat doet. Waarom zou je dan in hemelsnaam een query uitvoeren?

Cronjobs e.d. zijn hier dus absoluut niet nodig, gebruik deze dan ook niet. Het zorgt voor onnodige belasting van jouw database. Die heeft echt wel wat beters te doen dan zinloze queries uitvoeren.
Frank schreef op 15.01.2007 12:00
[quote='Martijn! schreef op 15.01.2007 11:02']Kijk eens naar de ontwikkelings versie (5.1 dacht ik) van MySQL. Hierin heb je events (zelfde principe als cronjobs(Linux) of geplande taken(Windows)). Alleen heb ik nog niet gezien dat je systeem commando's kunt uitvoeren.
Het is al meerdere keren gezegd, maar dit wil je niet! Het is volkomen zinloos om een query uit te voeren wanneer niemand iets met het resultaat doet. Waarom zou je dan in hemelsnaam een query uitvoeren?

Cronjobs e.d. zijn hier dus absoluut niet nodig, gebruik deze dan ook niet. Het zorgt voor onnodige belasting van jouw database. Die heeft echt wel wat beters te doen dan zinloze queries uitvoeren.[/quote]

[offtopic]Ja koffie drinken ofzo![/offtopic]

hehe nee maar idd je moet dit niet doen. Gewoon query uitvoeren als de gene zich aanmeldt. scheelt veel preformance zeker bij meerdere gebruikers.

Reageren