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.
- 2041 megtekintés
Hozzászólások
google://COMET
- A hozzászóláshoz be kell jelentkezni
ezt nem igazán értem
- A hozzászóláshoz be kell jelentkezni
Van egy COMET nevű technológia, ami pont erre való. Ami a gond vele, hogy PHP-ban nem igazán lehet szépen implementálni, de pl python-ban gyönyörű implementációi vannak.
- A hozzászóláshoz be kell jelentkezni
a www-data crontabja?
lefut percenként egy script, ami elvégzi a mysql-ben tárolt feladatokat
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
ez a masodpercenkenti idozites nagyon gyanus, biztosan szukseg van ra? (nem ismerek olyan webes jatekot ahol kellene)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
de a travian egy szar
amugy php script <? while(1) { /*megcsinalom amit akarok*/ sleep(1); /*pihenunk egyet hogy ne terheljuk agyon a szarvert*/ }
- A hozzászóláshoz be kell jelentkezni
A Travian nem szar. Max nem tudsz vele játszani vagy nincs rá időd.
Ps: Én is abbahagytam. Csak 1 kört bírtam végig, de ettől még jó marad.
A sleep-től meg szép döcögős lesz az oldal. Inkább terhelődjön a szerver. Azért van.
- A hozzászóláshoz be kell jelentkezni
feltéve ha a sajátja és birja, de aztmondta nem birja, ezert javasoltam az 1mp-t. amugy meg sose jatszottam vele csak hallottam hiret ami pont eleg volt ahhoz hogy eldontsem en nem akarok fuggove valni:)
- A hozzászóláshoz be kell jelentkezni
azért szar mert függővé válnál? :O
---------------------------------------------------------------------------------------
Az első platformfüggetlen virtualizációs rendezvény : http://www.virtualization-day.com
- A hozzászóláshoz be kell jelentkezni
Azért. Láttad volna a volt kollégiumi szobatársaimat... amikor épp nem a traviant nyomkodták, akkor is folyamatosan arról beszéltek.
Őőőő.. ez nem is szar. A játék készítőjének, a reklámozóknak, stb. Minden relatív :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Í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.
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
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 :) )
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
"mihez kell ez a masodpercenkenti cronfuttatas?"
Semmihez, nem is ezen akadtam ki.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
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ó.
- A hozzászóláshoz be kell jelentkezni
csak hogy bonyolítsam a helyzetet. mi lesz ha 1percen túl fut le a script?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni