Gå til innhold

Regulere tid/minne en bruker kan benytte seg av


Anbefalte innlegg

Kanskje litt dårlig beskrivelse, men jeg har et spill som ikke benytter seg av cron_jobs, men heller et script som kjøres hver gang en bruker logger på. Dersom det er noe i databasen som har fått forbi xx timestamp utfør yy. Men jeg er redd for at enkelte brukere som logger inn på en bestemt tid på døgnet kommer til å få maange ting som scriptet kjører igjennom på deres kappe.

 

Er det mulig å sette en grense for en funksjon, script eller noe liknende i form av microtime eller minne. Hvis denne limiten er nådd så vil den ignorere scriptet og gå videre?

 

Aldri vært borti noe sånt før, men hørt om spill som fungerer på denne måten, uten at jeg kan oppdrive åssen det funker...

 

Anyone som veit noe?

 

All hjelp mottas med det takk! Thomas

Lenke til kommentar
Videoannonse
Annonse

Det beste er nok å ikke kjøre slike jobber på en random bruker som uheldigvis logger inn på feil tidspunkt.

 

Men hva med heller å bruke en tilnærming der du deler den store jobben inn i mindre oppgaver (dersom det er mulig) slik at hver bruker som logger på eller hver sideoppdatering utfører bare en deloppgave.

 

Si at det er 10 oppgaver som må utføres når uheldig-Per logger på, så utføres bare den første. For hver sideoppdatering uheldig-Per gjør, kan det utføres en ny oppgave. Evt, hvis det bare gjøres ved innlogging, kan hver innlogging utføre kun en deloppgave.

 

Hvis du ønsker å begrense et script på minne eller tid har du konfigurasjonsettinger som:

 

max_execution_time

memory_imit

 

blandt annet

Lenke til kommentar

Har lekt med samme opplegget som deg et par ganger, det første tilfellet var et spill alá Dawn of Myth der man researchet og bygget ting som tok (n * haltimes "ticks") å gjøre ferdig. Løsningen her var ikke å lage en jobb, og "gjøre noe" når jobben var ferdig. Dette er bakvendt tenkning! Løsningen var å lage ordren ferdig i basen men med et timestamp-felt som sa når den var ferdig. Deretter var det bare for meg legge til "WHERE timestamp_done >= UNIX_TIMESTAMP()" når jeg listet mine ferdige byggninger eller det motsatte ("WHERE timestamp_done < UNIX_TIMESTAMP()") for å liste uferdige byggninger.

 

Skal du derimot ha noe der man f.eks. bestiller 10 "Miners" som det tar 4 timer å trene og som, når de er ferdige, utvinner 5 gold hver i timen.. Da er du nødt til å legge inn "jobber". Alikevel, den eneste "jobben" som må gå er å gi folk de ressursjene de skal ha, altså (gold = gold + (miners * 5)), hvert tick. Antall Miners finner du på samme måte som ferdige bygninger i eksemplet over. Når de bestilles lagres de med (timestamp_done = UNIX-TIMESTAMP()+ (3600*4)), altså er de ferdige om 4 timer. For å telle antall Miners henter du ut alle som tilhører en bruker og som har (timestamp_done >= UNIX_TIMESTAMP())

 

Håper du fikk med deg noe her, føler posten ble noget ustrukturert! x/

Lenke til kommentar

Tjaa, jeg tenker på en måte sånn som du gjør, men spillet mitt har blitt ganske stort og avansert, derfor er det ikke mulig å gjøre det på akkurat denne måten.

 

Slåssing f.eks: En bruker har 4 timer på å forbedre seg til kampen, så skjer kampen i løpet av 1 time (5 timer tilsammen). I løpet av de første 4 timene kan man kjøpe potions og legge til eqiupment, hvilke betyr at jeg ikke kan kjøre selve slåssingen før de 4 timene er over. I løpet av den siste timen må jeg "gjemme" sloss-resultatet helt til timen er ferdig. Denne påvirker stats, levler, score osv. Det enkleste er derfor å kjøre kampen når disse 5 timene er ferdige, heeeeelt på slutten av scriptet. Det er rett og slett 10 ganger mer jobb å begynne å endre det.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...