timing bij PHP/MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

David Festen

David Festen

14/01/2007 23:20:00
Quote Anchor link
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
 
PHP hulp

PHP hulp

19/11/2024 18:31:10
 
- SanThe -

- SanThe -

14/01/2007 23:24:00
Quote Anchor link
Tijd bijhouden in de database. Zodra de tijd is verlopen query uitvoeren.
 
Frank -

Frank -

14/01/2007 23:40:00
Quote Anchor link
Quote:
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.
 
David Festen

David Festen

15/01/2007 00:00:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door David Festen
 
Frank -

Frank -

15/01/2007 00:14:00
Quote Anchor link
Quote:
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.
 
David Festen

David Festen

15/01/2007 09:24:00
Quote Anchor link
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
 
Arjan Kapteijn

Arjan Kapteijn

15/01/2007 09:39:00
Quote Anchor link
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...
 
Robert Deiman

Robert Deiman

15/01/2007 10:00:00
Quote Anchor link
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.
 
Martijn B

Martijn B

15/01/2007 11:02:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Frank -

Frank -

15/01/2007 12:00:00
Quote Anchor link
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.
 
Jurgen assaasas

Jurgen assaasas

15/01/2007 12:04:00
Quote Anchor link
Frank schreef op 15.01.2007 12:00:
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.


Offtopic:
Ja koffie drinken ofzo!


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

Martijn B

15/01/2007 13:13:00
Quote Anchor link
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.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Frank -

Frank -

15/01/2007 14:55:00
Quote Anchor link
@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.
 
David Festen

David Festen

15/01/2007 17:10:00
Quote Anchor link
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
 
Frank -

Frank -

15/01/2007 17:15:00
Quote Anchor link
Quote:
"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.
 
David Festen

David Festen

15/01/2007 18:59:00
Quote Anchor link
Frank schreef op 15.01.2007 17:15:
Quote:
"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
 
Frank -

Frank -

15/01/2007 19:11:00
Quote Anchor link
Quote:
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...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.