PHP Web játék

Szeretnék készíteni egy játékot, amiben lehet időzíteni, pl 10 percen át tedd, vagy reggel 8-kor csinált, stb....

Egy mysql tárolná a tevékenységeket, és php lenne a feldolgozó.
Egy gondom van az időzítés, azaz hogyan mivel oldjam meg. Első gondolat, hogy a mysql-ben futtatok le egy kis belső alkalmazást, de ez eléggé leterhelheti azt, a másik gondolat, hogy egy a serveren futtatok egy php acriptet, de ez is leterhelheti a sql-t.

Elég sűrű időzítésre lenne szükség, majdnem másodpercenként.
Kérném segítségeteket, hogy melyik irányba induljak el.

Hozzászólások

a www-data crontabja?
lefut percenként egy script, ami elvégzi a mysql-ben tárolt feladatokat

miert terhelne le?

Nem sokat gondolkodtam rajta, biztos lehet okosabban is, de brute forcekent
a legkisebb cselekvesi idoig elkuldheted aludni a scriptet mindket esetben.
Pl ha a leggyorsabb cselekedet 5mp-et vesz igenybe akkor
sleep(min(<5mp>,< legkozelebbi cselekves befejezesi ideje>));

vagy, ha minden hosszabb mint egy perc, de fontos, hogy melyik mp-ben
fejezodik be akkor lehet kombinalni a crontabot egy alvos szkripttel.
ez esetben mindenkepp php script kell.

ez a masodpercenkenti idozites nagyon gyanus, biztosan szukseg van ra? (nem ismerek olyan webes jatekot ahol kellene)

a sleep azért kell, hogy másodpercenként ne fusson le 58 ezerszer az a nyomorult függvény, amikor elég 1-szer is hogy lefusson.
ha nem teszed bele, akkor 100%-os processzorpörgést fog eredményezni, és a többi php szkript ezért "döcögősen" fog futni.

Írsz egy daemont, ami elvégzi az éppen lejáró taskokat. Amikor új task nő, küldesz neki egy interruptot hogy fölébredjen. Annyira nem bonyolult, ki kell választani egy szimpatikus programnyelvet (amely lehetőleg nem a PHP, mert ott pl a socketen várakozás lemaskolja az interruptokat) és meg kell írni.


Travian? :) Elég népszerű. Főleg magyar és német terepen.
Ott még a tized másodperc is számít, még ha nem is számolja.
Értsd: 1sec alatt több feladat is indulhat vagy végződhet időrendi sorrendben.

igen, de ott csak akkor fut le valami (gondolom en), ha a bongeszod leker uj adatokat. Ha feltetelezzuk, hogy egy orat senki sem jatszana, nincs minek miert lefutnia.... egy ora mulva kiszamolja hogy mi tortent (szvsz). A kerdes nem arra vonatkozott, hogy van-e olyan jatek, ami masodpercenkent tobbszor is lekerdez valamit az adatbazisbol (persze hogy van), hanem hogy van-e olyan jatek ahol feltetlenul szukseg van cron-bol allandoan frissiteni az adatbazist, akkor is ha a jatekosok passzivak, es nem csinalnak semmit (vagyis a jatekosok akcioitol fuggetlenul allandoan matatni az adatbazisban)

"gondolom en"

Rosszul gondolod.

Valószínűleg egy egy szálú* háttérprocess lehet a háttérben, mert az eseményeket lineárisan hajtja végre függetlenül attól, hogy nézi-e valaki az oldalt vagy sem.

Eleve külön számolja az időt és a játékidőt (ld. eseménytorlasz, mikor belassul a szerver és nem dolgozza fel elég gyorsan az eseményeket a szerver, volt már olyan is, hogy 6+ órás csúszásban volt a játék a valósággal - ilyenkor nem be is dobják a "karbantartás van, ne nyomkodd" oldalt, mire nagyjából szinkronba kerül a játék a valósággal.) Egyébként itt régebben volt is szép nagy bug (valószínűleg), mert pl. a búzafogyasztást és a nyersanyagot az aktuális idő szerint számolta, ami nagyon nem jó.

* Ezt csak a bugjaiból ítélve.

----------------
Lvl86 Troll

Valószínűleg egy egy szálú* háttérprocess lehet a háttérben, mert az eseményeket lineárisan hajtja végre függetlenül attól, hogy nézi-e valaki az oldalt vagy sem.

Viszont ez sem a "cron hivogatja masodpercenket tobbszor a funkciot" megoldas, hanem egy allandoan futo processz. Mint egy real time jatekprogram (amitol a webszerver kerdezgeti hogy eppen mi tortenik). (persz ki tudja igazabol hogy csinaltak? ez csak az en tippem... fut e a processz, ha nem jatszik senki? ... ad-e ki hangot az oserdoben kidolo fa, ha senki nincs a kozelben aki hallja :) )

Szerintem nézd már meg, hogy mi az a Travian :)

"Viszont ez sem a "cron hivogatja masodpercenket tobbszor a funkciot" megoldas, hanem egy allandoan futo processz. "

Igen, ezt mondtam.

"Mint egy real time jatekprogram"

Mivel ez egy real time játékprogram.

"(amitol a webszerver kerdezgeti hogy eppen mi tortenik)."

99%-ra saccolom, hogy a háttérfolyamat beírja DB-be, hogy mit csinált, a frontend

"fut e a processz, ha nem jatszik senki? ..."

Az események akkor is végrehajtódnak, ha senki nem játszik. Mondjuk Travianon viszonylag ritka az, hogy senki nincs fenn.

"ad-e ki hangot az oserdoben kidolo fa, ha senki nincs a kozelben aki hallja :) )"

Nem, mert nem ad ki hangot (böngészőből játszható, HTML+JS alapú.)

----------------
Lvl86 Troll

szoval abban, amivel kezdtem a mondandomat, egyetertunk :) : "ez a masodpercenkenti idozites nagyon gyanus, biztosan szukseg van ra? (nem ismerek olyan webes jatekot ahol kellene)"
... mert mint ahogy kiderult: (valoszinuleg) az ellenpeldanak felhozott Travian sem ilyen.

viszont megkerdeznem az eredeti problemafelvetot: mihez kell ez a masodpercenkenti cronfuttatas?

jajj, a travian :)
volt szerencsém a kódjához, nézzük mi mennyire real-time benne....

Az események másodpercenként, id alapján vannak feldolgozva. Ha az új másodperc végéig nem fejeződik be az előző másodperc eseménylistája, akkor alakul ki eseménytorlasz. Ekkor új eseményt nem lehet betenni az eseménylistába.

A búza, agyag, hadsereg, stb állása pedig az utolsó rád vonatkozó esemény utáni adatbázistáblaállapot, és az azóta eltelt másodpercek számából jön, ha érdekel valakit hogy hogyan, akkor nézze meg a javascriptben hogy hogy számolódik.

Szóval nem real time.

"Ekkor új eseményt nem lehet betenni az eseménylistába."

Az úgy érdekes, mert kisebb torlaszok esetén minden további nélkül lehetett pl. új támadást indítani.

"A búza, agyag, hadsereg, stb állása pedig az utolsó rád vonatkozó esemény utáni adatbázistáblaállapot"

Igen, én is így gondoltam, hogy nem frissíti másodpercenként, csak amikor kell. (Esemény van, frissíti a player az oldalt). Viszont itt tűnt egy nagyobb eseménytorlasznál úgy, hogy nem a játékban eltelt másodpercek számát veszi, hanem a valóságban eltelt másodpercek számát és ez alapján számolja az éhenhalást.

Az meg ugye nem vicces, amikor van egy órás torlasz, jönne a búza, csak épp nem "ér be", mert még nem hajtódott végre az esemény, ellenben a katonák döglenek szépen. Egy bevédett csodánál azért ez már nem mindegy.

"ha érdekel valakit hogy hogyan, akkor nézze meg a javascriptben hogy hogy számolódik."

Ami ugye nem igazán befolyásolja azt, hogy mi történik a szerveren.

----------------
Lvl86 Troll

csinálsz egy php-t, amit cronból percenként meghívsz.

$kezdeti_ido=time();
while($kezdeti_ido>time()-60)
{
masodpercenkent_meghivando_fuggveny();
sleep(1);
}

ennyi nagyjából elég kell hogy legyen, másodpercenként biztosan feldolgoz, és a körítés futási ideje is elhanyagolható.

Amit a kolléga írt, semmiképpen nem követendő megoldás. Ha már muszáj PHPban, akkor microtime szintjén időzítsünk, de ha egy mód van rá, el kéne kerülni az említett nyelv ilyen célra való használatát. Több a szívás vele, mint megtanulni egy daemon írására alkalmas nyelvet.