Autor | Zpráva | ||
---|---|---|---|
perwin Profil |
#1 · Zasláno: 21. 4. 2011, 11:39:00
Ahoj,
potřeboval bych poradit, jak v PHP vyrobit script, který by dokázal, aby se vždy do nějaké tabulky v celé hodiny přičítali nějaká čísla: v 00:00 přičte do sloupce pricist cislo 20, v 01:00 přičte do sloupce pricist cislo 20,... 24:00 přičte do sloupce pricist cislo 20, a toto se opakuje neustále... Děkuji za rady |
||
Krakatoa Profil |
#2 · Zasláno: 21. 4. 2011, 12:25:56
cron (nastaví spouštění php scriptu v daný čas a to i opakovaně) a php script
|
||
Keeehi Profil |
#3 · Zasláno: 21. 4. 2011, 12:51:40
perwin:
Můžeš nám napsat, proč je to takto potřeba? Cron použít můžeš, ale dá se vymyslet třeba i lepší řešení. |
||
perwin Profil |
#4 · Zasláno: 21. 4. 2011, 12:56:59 · Upravil/a: perwin
Keeehi:
Vyrábím jednu webgame a hráči se každou hodinu přičítají suroviny... Stačí? |
||
Keeehi Profil |
#5 · Zasláno: 21. 4. 2011, 13:04:15
perwin:
Tak to se většinou dělá tak, že se počítá kolik má daný hráč surovin až v momentě, kdy je to potřeba. Tudíž si uložíš poslední stav suroviny a a příslušný čas, v kolik to bylo a když bude tu surovinu potřebovat (např za 3,5 hodiny) tak se podíváš do databáze, zjistíš rozdíl mezi uloženým časem a nynějším časem (3,5) a tím vynásobíš 20 a tím zjistíš přírůstek. Pokud tedy ve 12:00 má 100 surovin a bude chtít třeba v 15:30 zjistit, kolik surovin má, tak 100 + 3,5*20 = 170. Tento výsledek zase uložíš do databáze s aktuálním časem. |
||
perwin Profil |
#6 · Zasláno: 21. 4. 2011, 13:20:40 · Upravil/a: perwin
Keeehi:
No od toho jsem taky chtěl tu poslední aktivitu uživatele. EDIT: Zjistil bych, kolik času ubylo od jeho poslední aktivity a vynásobil bych ho tou produkcí. -> tolik surovin by mu pribylo. |
||
Keeehi Profil |
#7 · Zasláno: 21. 4. 2011, 13:30:35
perwin:
Pak stačí tu aktivitu počítat přece při přechodu mezi stránkami. To že hejbe s myší je jedno, když se ta stránka neaktualizuje. Ta hodnota, kolik má těch surovin, zůstává stejná do té doby, než přejde na jinou stránku, nebo tu stránku obnoví. A to znamená nový požadavek na server a ten se dá spolehlivě odchytit. |
||
perwin Profil |
#8 · Zasláno: 21. 4. 2011, 14:35:18
Keeehi:
Díky moc :-) Už jsem to vyřešil. |
||
perwin Profil |
#9 · Zasláno: 21. 4. 2011, 16:19:51 · Upravil/a: perwin
Tady jsem si vyrobil kód, aby mi to při každém refreshi (přechodu na jinou stránku) zapsalo nový počet surovin:
<?php session_start(); require('db.php'); if(isset($_POST['url'])) { $url = $_POST['url']; $ryby = $_POST['ryby']; // poslední počet ryby $les = $_POST['les']; // poslední počet dřeva $obili = $_POST['obili']; // poslední počet obilí $hlina = $_POST['hlina']; // poslední počet hlíny $zelezo = $_POST['zelezo']; // poslední počet železa $date = MySQL_Query("SELECT lastActivity, lastRyby, lastLes, lastObili, lastHlina, lastZelezo FROM `gameusers` WHERE nick='$_SESSION[login]'") or die (mysql_error()); $datum = mysql_fetch_array($date); // poslední počet surovin zapsaný v DB $lastActivity = $datum['lastActivity']; // poslední aktivita uživatele $now = date("Y-m-d H:i:s"); // čas nyní $uplynuly_cas_s = strtotime($now)-strtotime($lastActivity); // kolik času uplynulo od poslední aktivity v sekundách $uplynuly_cas_m = $uplynuly_cas/60; //totéž v minutách $suroviny = MySQL_Query("SELECT ryby_sur, les_sur, obili_sur, hlina_sur, zelezo_sur, ryby_produkce, les_produkce, obili_produkce, hlina_produkce, zelezo_produkce FROM `gamevesnice` WHERE vlastnik='$_SESSION[login]'") or die (mysql_error()); $surky = mysql_fetch_array($suroviny); // znovu počet surovin (z jiné tabulky) a jejich produkce za hodinu $srmin = $surky["ryby_produkce"]/60; /* produkce ryb za minutu */ $new_ryby = round($uplynuly_cas_m * $srmin + $ryby); // nový počet ryb: zaokrouhleno(kolik minut uplynulo KRÁT produkce ryb za minutu + bývalý počet ryb) $slmin = $surky["les_produkce"]/60; /* produkce dřeva za minutu */ $new_les = round($uplynuly_cas_m * $slmin + $les); // -//- $somin = $surky["obili_produkce"]/60; /* produkce obilí za minutu */ $new_obili = round($uplynuly_cas_m * $somin + $obili); // -//- $shmin = $surky["hlina_produkce"]/60; /* produkce hlíny za minutu */ $new_hlina = round($uplynuly_cas_m * $shmin + $hlina); // -//- $szmin = $surky["zelezo_produkce"]/60; /* produkce železa za minutu */ $new_zelezo = round($uplynuly_cas_m * $szmin + $zelezo); // -//- mysql_query("UPDATE gameusers SET lastActivity=NOW(), lastRyby='$new_ryby', lastLes='$new_les', lastObili='$new_obili', lastHlina='$new_hlina', lastZelezo='$new_zelezo' WHERE nick='$_SESSION[login]'") or die (mysql_error()); // zapsání posledních počtu surovin mysql_query("UPDATE gamevesnice SET ryby_sur='$new_ryby', les_sur='$new_les', obili_sur='$new_obili', hlina_sur='$new_hlina', zelezo_sur='$new_zelezo' WHERE vlastnik='$_SESSION[login]'") or die (mysql_error()); header("Location: ".$url."&refresh=no"); // návrat na předchozí stránku } else { header("Location: /index.php?page=uvod&Alert=5"); } ?> Děkuji |
||
perwin Profil |
#10 · Zasláno: 21. 4. 2011, 16:35:36
Myslím si, že ten CRON bude asi lepší... -> Jak lze nastavit PHP kód tak, aby u každého uživatele vybral poslední počet surovin, a sečetl ho s produkcí toho uživatele? Umím to udělat, když mám přesný název toho uživatele - mohu vybrat jeho poslední počet surovin, a k němu vybrat z druhé tabulky tu produkci.. ale jak to udělat, aby se to postupně provádělo u každého uživatele, když přece nemůžu zadat jména všech uživatelé dohromady?
|
||
Louka Profil |
#11 · Zasláno: 21. 4. 2011, 21:41:27
Můžeš upřesnit, jak to nefunguje? Chybové hlášení nebo něco? Cron je na to opravdu zbytečný.
|
||
pcmanik Profil |
#12 · Zasláno: 21. 4. 2011, 21:48:29
Louka
Cron nieje zbytocny, zamysli sa. Zautoci na neho niekto a bude mat malo surovin a pri tom ich mam mat uz 5 x tolko, takze je to hlupost a na toto treba pouzit cron. Samozrejme za predpokladu ze sa v tej hre bude utocit, co je velmi pravdepodobne. |
||
Louka Profil |
#13 · Zasláno: 21. 4. 2011, 21:57:50
pcmanik:
Myslím, že i při útoku lze spočítat, kolik surovin napadenému přibylo. |
||
pcmanik Profil |
#14 · Zasláno: 21. 4. 2011, 22:13:19
Louka:
To ano, ale je lepsie pouzit jeden dotaz popripade 2 kazdu hodinu, alebo neustale ich posielat na databazu? Povedzme ked bude naraz 100 ludi, tak to uz bude pre obycajny hosting celkom velka zataz. |
||
Louka Profil |
#15 · Zasláno: 21. 4. 2011, 22:26:51
1 nebo 2? Když bude registrováno 1000 hráčů, tak to ale bude 1 nebo 2 pro každého ne? A dotaz stejně budeš buset vykonat i při útoku, abys zjistil kolik těch surovin (připočítávaných cronem) je.
Takhle stačí jen při útoku zavolat dotaz a pak z něj dopočítat aktuální hodnoty... |
||
pcmanik Profil |
#16 · Zasláno: 21. 4. 2011, 22:41:31
Louka:
1, alebo 2 za hodinu, je rozdiel, ako ked sa budu neustale odosielat pri kazdom pohybe na webe, samozrejme neviem ci ide perwin-ovi o to aby mal tie suroviny presne, alebo pri kazdej hodine. A pri utoku bude treba brat dalsie stlpce, v ktorych je hodinova produkcia, co je v celku zbytocne, ale potrebne pre dopocitanie tej aktualnej hodnoty. |
||
Keeehi Profil |
#17 · Zasláno: 21. 4. 2011, 23:00:25
Pokud by se měli suroviny připočítávat vždy přesně v xx:00 (v hodinových intervalech) tak by šel použít cron, pokud by se měly suroviny připočítávat průběžně (ne po hodinových dávkách) tak je potřeba to počítat až když je potřeba. Obzvlášť v případě, že se každému hráči během hodiny přidá jiný počet surovin.
pcmanik: „A pri utoku bude treba brat dalsie stlpce, v ktorych je hodinova produkcia, co je v celku zbytocne, ale potrebne pre dopocitanie tej aktualnej hodnoty.“ To zase nějaké velké zdržení nebude. Navíc během dne ti přibude více surovin, než kolikrát na tebe zaútočí, takže ten dotaz při útočení se poměrem nebude vykonávat až tak často. Ještě mě napadl jeden teoretický problém přidělování surovin v balících po hodinách. Vždy v celou bude na servru nával, jelikož všichni hráči budou čekat na příděl surovin. Při postupném doplňování surovin tento problém nehrozí. |
||
perwin Profil |
#18 · Zasláno: 22. 4. 2011, 08:25:13 · Upravil/a: perwin
Keeehi:
Zkusím to s tím CRONem, kdyby to dělalo problémy tak to předělám... Teď bych poprosil o radu, jak ten PHP kód pro CRON nastavit.. Vyrobil jsem tohle: <?php session_start(); require('db.php'); $sur = MySQL_Query("SELECT ryby_produkce, les_produkce, obili_produkce, hlina_produkce, zelezo_produkce FROM `gamevesnice` ORDER BY id_uzivatele") or die (mysql_error()); while($surs = mysql_fetch_array($sur)) { mysql_query("UPDATE gameusers SET lastRyby=lastRyby+'$surs[ryby_produkce]', lastLes=lastLes+'$surs[les_produkce]', lastObili=lastObili+'$surs[obili_produkce]', lastHlina=lastHlina+'$surs[hlina_produkce]', lastZelezo=lastZelezo+'$surs[zelezo_produkce]'") or die (mysql_error()); mysql_query("UPDATE gamevesnice SET ryby_sur=ryby_sur+'$surs[ryby_produkce]', les_sur=les_sur+'$surs[les_produkce], obili_sur=obili_sur+'$surs[obili_produkce], hlina_sur=hlina_sur+'$surs[hlina_produkce], zelezo_sur=zelezo_sur+'$surs[zelezo_produkce]'") or die (mysql_error()); } ?> A ktomu je tam ten problém, že kdyby někdo odhalil, že přidává suroviny tento soubor, tak by ho mohl pořád vyvolávat a tudíž pořád přidávat suroviny... Děkuji |
||
pcmanik Profil |
#19 · Zasláno: 22. 4. 2011, 08:35:11 · Upravil/a: pcmanik
Nemas ukoncene niektore ' a ak ti to aj tak nepojde, tak si to skus spustit rovno na mysql servery, ci ti to bude vracat, to co cakas
A v tych UPDATOCH musis pridat WHERE id_vesnice = id_uzivatele, inak to nevie ze koho to ma zaktualizovat, resp to meni vsetkym uzivatelom. V SELECTE teda musis tahat aj id uzivatela a dediny. UPDATY mozes skombinovat do jedneho. A skutocne potrebujes volat session_start() na zaciatku? |
||
Časová prodleva: 15 let
|
0