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
Frank schreef op 15.01.2007 12:00
...


Wat denk je van:

- Records die moeten worden veranderd/verwijderd omdat b.v. deze langer dan een x aantal seconden in de DB staan.
- Periodieke database backups
- Proces gegevens updaten. (bijvoorbeeld hoeveel producten heb ik in mijn database of hoeveel producten zitten er in een bepaalde categorie)
- Database consistentie (Als je geen InnoDB hebt of niet van Foreign keys gebruik maakt kun je queries uitvoeren die kijken of b.v. een gekoppeld merk wel bestaat)
- Log berichten (b.v. hoeveel bestellingen vandaag)
- Een nieuwsbrief samenstellen (versturen lukt niet denk ik ;D)

Eigenlijk alle zaken in de DB die je niet door een gebruiker/bezoeker wilt laten triggeren kun je met een event afhandelen.

edit:

Je moet natuurlijk niet iets doen waar je niks aan hebt of niet mee doet. Dat ben ik natuurlijk helemaal met je eens.
@Martijn:
- Records die moeten worden veranderd/verwijderd
Geen cronjob nodig, 1x in de week/maand/jaar bijwerken is meestal wel voldoende. Verder kun je met de datumtijdstempels precies bepalen wat je wél en wat je niet wilt veranderen/verwijderen, dat kun je doen op het moment dat je de gegevens nodig hebt. En een database kan echt wel een paar miljard records kwijt, er staat dus niet zo snel iets in de weg.

- Periodieke database backups
Dit is inderdaad een klantje voor een cronjob, je wilt namelijk dagelijks op een vast tijdstip een backup maken.

- Proces gegevens updaten.
Lijkt mij niet nodig om daarvoor een cronjob in te zetten. Een goede query is meer dan voldoende en die voer je uit wanneer je de gegevens nodig hebt.

- Database consistentie (Als je geen InnoDB hebt of niet van Foreign keys gebruik maakt kun je queries uitvoeren die kijken of b.v. een gekoppeld merk wel bestaat)
Nee, dit heeft niks met een cronjob te maken, maar alles met een blunder van de eerste orde. Hoe verzin je het om op deze manier een 'database' aan te maken, dit heeft niks meer met een DBMS te maken. Het is ook het aller, aller zwaktste punt van MySQL en dan met name de MyISAM-engine. Het is gewoon dom om deze te gebruiken. Een lapmiddel als een cronjob om de data consistentie te checken slaat imho nergens op. Zorg voor een goede database en je hebt deze onzin niet nodig.

- Log berichten
Geen cronjob nodig, op basis van de datumtijdstempels kun je zo zien hoeveel bestellingen er op een bepaalde dag zijn verricht. Een goede query opstellen is meer dan voldoende.

- Een nieuwsbrief samenstellen
Het versturen wil je op een vast moment doen, een cronjob kan hier uitkomst bieden.

Kortom, cronjobs heb je alleen nodig wanneer je op een vast tijdstip gegevens veilig wilt stellen of wilt versturen. Het moet dus iets opleveren dat je op dat moment nodig hebt en wat je onmogelijk op een later moment kunt uitvoeren. Van de 6 voorbeelden die jij geeft, zijn er slechts 2 waarbij je een cronjob nodig hebt.
oke, ik heb nu de oplossing dus (voor wie het wil weten):

"puntent toekennen" op welke manier dan ook is het makkelijkst te doen door het verschil in tijd te meten

"Query na een bepaalde tijd uitvoeren" is het makkelijkst te realiseren door de record een datum in de toekomst toe te wijzen en het pas te laten herkennen als die datum berijkt is.

bedankt voor alle moeite
"Query na een bepaalde tijd uitvoeren" is het makkelijkst te realiseren door de record een datum in de toekomst toe te wijzen en het pas te laten herkennen als die datum berijkt is.
Ik weet niet of dit wel de handigste manier is. Je kunt nu namelijk nooit meer de regels aanpassen zonder dat allerlei records moeten worden aangepast.

Het lijkt mij handiger om in de WHERE-voorwaarde het juiste verschil in tijd op te nemen. Wil je dan de regels van het spel aanpassen, 10 minuten i.p.v. 12, dan hoef je alleen maar de INTERVAL in de query aan te passen en niet alle records die in de database staan.
Frank schreef op 15.01.2007 17:15
"Query na een bepaalde tijd uitvoeren" is het makkelijkst te realiseren door de record een datum in de toekomst toe te wijzen en het pas te laten herkennen als die datum berijkt is.
Ik weet niet of dit wel de handigste manier is. Je kunt nu namelijk nooit meer de regels aanpassen zonder dat allerlei records moeten worden aangepast.

Het lijkt mij handiger om in de WHERE-voorwaarde het juiste verschil in tijd op te nemen. Wil je dan de regels van het spel aanpassen, 10 minuten i.p.v. 12, dan hoef je alleen maar de INTERVAL in de query aan te passen en niet alle records die in de database staan.


Je kan ook gewoon in het PHP script voortaan time() + 12 doen ipv time() + 10, dat betekent wel dat alles wat al gebeurt is niet meer terug te rekenen valt, maar dat is toch niet echt de bedoeling
Je kan ook gewoon in het PHP script voortaan time() + 12 doen ipv time() + 10, dat betekent wel dat alles wat al gebeurt is niet meer terug te rekenen valt, maar dat is toch niet echt de bedoeling
Klopt, je kunt het ook met PHP oplossen. Vaak is het alleen handiger om de database het werk te laten doen, die kan dat uitstekend zelf oplossen, daar hoef jij geen php-code voor te gaan schrijven. Scheelt je weer tijd met debuggen e.d.

Verder is het altijd handig om de code flexibel te houden, er komen namelijk altijd wijzigingen in je systeem. Spreek (helaas) uit ervaring...

Reageren