[php] köra script vid exakt tidpunkt

Permalänk
Avstängd

[php] köra script vid exakt tidpunkt

Hej!

Håller på med ett webbspel och jag behöver hjälp med en sak , jag har sökt men inte förstått riktigt vad jag ska använda.

Jag vill alltså ha, när spelaren tex. skapar en ny produkt, så skall det ta 2 minuter att skapa produkten, när det gått 2 minuter, vare sig spelaren är kvar på sidan eller inte , så skall produkten ändå göras efter 2 minuter och detta skall då skrivas in i databasen.

Dvs:

spelaren skapar en kaka --> kakan bakas i exakt 2 minuter ---> kakan är färdig och läggs in i databasen.

Detta ska alltså kunna göras även om spelaren inte är kvar på sidan.

Vad använder jag för detta?

Har aldrig någonsin använt nåt script där jag behöver ha just detta , så vad föreslår ni?

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]

Permalänk
Medlem

Hat du möjlighet att köra cronjobs på servern eller liknande?

Skickades från m.sweclockers.com

Permalänk
Avstängd

@Kiane:

japp är min egna linuxserver jag utvecklar sidan på

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]

Permalänk
Medlem

Då får man köra cronjbben hela tiden typ varje minut uppdaterar du alla användare och produkter.
Annars får du timestampa produkterna så de skapas direkt men med en tid då de är klara som du sedan använder, och sen anropas av de andra spelarna som jag gissar att du vill.

Permalänk
Avstängd

@tsarraz:

sant som du säger, det man kan göra kanske dock är de väl lite "hemmasnickarat" men att skapa en ny kolumm i databasen som heter typ produkt_ofärdig (där produkten lägger sig först) och använda en annan kolumm som heter färdig_tid (tiden då man kan hämta produkten) , där det lägger sig tills de att tiden är uppnådd, känns ju jävligt onödigt att behöva gå den vägen, men kanske är den enda rätta?

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]

Permalänk
Skrivet av tsarraz:

Då får man köra cronjbben hela tiden typ varje minut uppdaterar du alla användare och produkter.
Annars får du timestampa produkterna så de skapas direkt men med en tid då de är klara som du sedan använder, och sen anropas av de andra spelarna som jag gissar att du vill.

Jag tror han vill att användaren ska baka en kaka i 2 minuter. Inte att alla kakor från alla användare bakas samtidigt varannan minut.

Jag hade gjort en databas och en tabell som heter cooking. När något bakas timestampar jag objektet å skjuter in infon i databasen. Sen har en tråd som snurrar som bara har i uppgift att kolla den databasen. Hämta alla rader med tid längre än 2 min. Eller skapa en ny tråd med timer och objektet som variabel. Låter den snurra i 2 min och skickar in objektet i databasen.

Finns säkert smartare och bättre sätt att göra det på men detta va det första jag kom på.

Skickades från m.sweclockers.com

Permalänk
Medlem

Är nog enklast om du tänkt att spelet skall bli större senare.
Det enda rätta är dock fel svar... Man kan lösa saker på många sätt.

Permalänk

Är det inte enklare att göra beräkningarna när spelaren kommer tillbaka? Du vet när produkten skapades och vet därmed när den är klar. Vad är det för poäng med flagga den som klar förrän spelaren loggar in igen?

Visa signatur

Workstation: i5-6600K, 16GB DDR4, ASUS Z170 Pro Gaming, 250GB Samsung 850 Pro SSD, DELL Ultrasharp U2715 27" IPS
Laptop: MacBook Pro 13" Intel Core 2 Duo 2.4GHz, 8GB RAM, 1280x800, 250GB SSD, DELL Ultrasharp 2209WA 22" LCD
Filserver: HP Proliant DL120 G7, 16GB RAM, 4TB RAID 1

Permalänk
Medlem
Skrivet av superboss:

Är det inte enklare att göra beräkningarna när spelaren kommer tillbaka? Du vet när produkten skapades och vet därmed när den är klar. Vad är det för poäng med flagga den som klar förrän spelaren loggar in igen?

Mest troligt för att det är spel där man förbättrar sitt försvar eller liknande och man blir attackerad även när man är offline

Skickades från m.sweclockers.com

Permalänk

Då beräknar man väl lämpligen försvaret vid ett eventuellt anfall.. kommer bli ruskigt mycket skrivningar om det är många spelare och allt ska ske i realtid. Helt i onödan dessutom om ingen försöker accessa datat.

Visa signatur

Workstation: i5-6600K, 16GB DDR4, ASUS Z170 Pro Gaming, 250GB Samsung 850 Pro SSD, DELL Ultrasharp U2715 27" IPS
Laptop: MacBook Pro 13" Intel Core 2 Duo 2.4GHz, 8GB RAM, 1280x800, 250GB SSD, DELL Ultrasharp 2209WA 22" LCD
Filserver: HP Proliant DL120 G7, 16GB RAM, 4TB RAID 1

Permalänk
Medlem
Skrivet av superboss:

Då beräknar man väl lämpligen försvaret vid ett eventuellt anfall.. kommer bli ruskigt mycket skrivningar om det är många spelare och allt ska ske i realtid. Helt i onödan dessutom om ingen försöker accessa datat.

helt sant om man inte gör det för att lära sig

Skickades från m.sweclockers.com

Permalänk
Medlem

Jag tycker du kan skapa kakan i databasen direkt när användaren trycker baka, men sätt ett timestamp som är 2 minuter fram i tiden, typ "ValidFrom".

Permalänk
Avstängd

såhär löste det sig väldigt "enkelt":

Jag vill inte avslöja vad sidan handlar om, utan jag väljer att kalla det för kaka för enkelhetens skull, ska ni använda detta själva så får ni troligen modifiera det en del.

Den lägger alltså in koden i en databas, som sedan hämtas upp av ett javascript på själva "bak-sidan".

Detta funkar alltså även om personen går ifrån sidan eller om den är kvar på sidan, man måste alltså hämta upp sin kaka.

<?php $cur_time=date("Y-m-d H:i:s"); /// Ange tiden när det skall vara klar $duration='+2 minutes'; $koktid = date('Y-m-d H:i:s', strtotime($duration, strtotime($cur_time))); $user = $_SESSION['user_name']; $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $dbname = "produkt"; $conn2 = mysql_connect($dbhost, $dbuser, $dbpass, $dbname); mysql_select_db( 'login' ); $result2 = mysql_query("UPDATE users SET mjol=mjol - 30,koka_antal=koka_antal+4,koka_start='$koktid', vatten=vatten-10,hp=hp-5,xp=xp+60 WHERE user_name='$user'") or die(mysql_error()); echo "Din kaka kommer vara klar:"; echo $koktid; ?>

Ett javascript som känner av om tiden är uppnådd och när tiden är uppnådd så visas en länk där personen kan hämta sin "kaka" visas även i realtid :

<?php /// Hämtar datan om när den skall vara klar $kaka_klar= $row[17];?> <script type="text/javascript"> function counter() { var variable = <? echo (json_encode($kaka_klar)) ?>; var t = variable.split(/[- :]/); var gametime = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); var now = new Date(); var timeDiff = gametime.getTime() - now.getTime(); var timer = setTimeout('counter()'); if (timeDiff <= 0) { clearTimeout(timer); var str = "Din kaka är klar!"; var result = str.link("hamta_kakan.php"); document.getElementById("demo").innerHTML = result; } var seconds = Math.floor(timeDiff / 1000); var minutes = Math.floor(seconds / 60); minutes %= 60; seconds %= 60; document.getElementById("mins").innerHTML = minutes; document.getElementById("sec").innerHTML = seconds; } </script>

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]

Permalänk
Skrivet av alexander87:

såhär löste det sig väldigt "enkelt":

Jag vill inte avslöja vad sidan handlar om, utan jag väljer att kalla det för kaka för enkelhetens skull, ska ni använda detta själva så får ni troligen modifiera det en del.

Den lägger alltså in koden i en databas, som sedan hämtas upp av ett javascript på själva "bak-sidan".

Detta funkar alltså även om personen går ifrån sidan eller om den är kvar på sidan, man måste alltså hämta upp sin kaka.

<?php $cur_time=date("Y-m-d H:i:s"); /// Ange tiden när det skall vara klar $duration='+2 minutes'; $koktid = date('Y-m-d H:i:s', strtotime($duration, strtotime($cur_time))); $user = $_SESSION['user_name']; $dbhost = 'localhost'; $dbuser = 'root'; $dbpass = ''; $dbname = "produkt"; $conn2 = mysql_connect($dbhost, $dbuser, $dbpass, $dbname); mysql_select_db( 'login' ); $result2 = mysql_query("UPDATE users SET mjol=mjol - 30,koka_antal=koka_antal+4,koka_start='$koktid', vatten=vatten-10,hp=hp-5,xp=xp+60 WHERE user_name='$user'") or die(mysql_error()); echo "Din kaka kommer vara klar:"; echo $koktid; ?>

Ett javascript som känner av om tiden är uppnådd och när tiden är uppnådd så visas en länk där personen kan hämta sin "kaka" visas även i realtid :

<?php /// Hämtar datan om när den skall vara klar $kaka_klar= $row[17];?> <script type="text/javascript"> function counter() { var variable = <? echo (json_encode($kaka_klar)) ?>; var t = variable.split(/[- :]/); var gametime = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); var now = new Date(); var timeDiff = gametime.getTime() - now.getTime(); var timer = setTimeout('counter()'); if (timeDiff <= 0) { clearTimeout(timer); var str = "Din kaka är klar!"; var result = str.link("hamta_kakan.php"); document.getElementById("demo").innerHTML = result; } var seconds = Math.floor(timeDiff / 1000); var minutes = Math.floor(seconds / 60); minutes %= 60; seconds %= 60; document.getElementById("mins").innerHTML = minutes; document.getElementById("sec").innerHTML = seconds; } </script>

Bara så du vet, så kommer mysql_vara depricated i PHP7. Så har du precis börjat med spelet så är det nog bra att börja gå över mot att använd PDO istället.

StackOverflow why shouldn't I use mysql functions in php

Skrivet av superboss:

Då beräknar man väl lämpligen försvaret vid ett eventuellt anfall.. kommer bli ruskigt mycket skrivningar om det är många spelare och allt ska ske i realtid. Helt i onödan dessutom om ingen försöker accessa datat.

Smart! Att lägga in en timestamp när kakan eller soldaten ska vara klar helt enkelt och om någon vill anfalla dig så hämtar man bara alla trupper fram till tiden just nu.

Permalänk
Avstängd
Skrivet av for_each_while:

Bara så du vet, så kommer mysql_vara depricated i PHP7. Så har du precis börjat med spelet så är det nog bra att börja gå över mot att använd PDO istället.

StackOverflow why shouldn't I use mysql functions in php

Smart! Att lägga in en timestamp när kakan eller soldaten ska vara klar helt enkelt och om någon vill anfalla dig så hämtar man bara alla trupper fram till tiden just nu.

Jag ska kolla på det , känns ju som att det är lika bra att gå över till PDO istället, eftersom jag inte släppt spelet ännu utan fortfarande är i utvecklingsfas och har endast suttit med det i 3 veckor så känns det värt det.

Är det skillnad prestandamässigt att byta till pdo jämfört med mysql ?

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]

Permalänk

@alexander87:

Vet faktiskt inte hur prestandan är. Har inte suttit så mycket med PHP. Men jag tyckte det va ganska enkelt att komma igång med PDO.

Eftersom du gör ett spel antar jag att du har mycket "tärnings rullande" om vem som vinner. Många använder fortfarande rand() men det är mt_rand() som ska användas.

Det superboss skrev skulle jag säga är det bästa sättet att göra det på.

När någon "bakar en kaka" eller "tränar en soldat" så sätter du en tid på soldaten när han är färdigtränad. Om jag sen anfaller dig t.ex. så gör du bara en databas query. SELECT * FROM soldiers WHERE trainingtime < '2015-10-27 09:19:00';
Där läste jag att det kan finnas lite performance issues om du inte skickar in ett datum själv. Det kan du göra med PHP dock.

Ungefär så, men du löser det nog snyggare och bättre!

Permalänk
Avstängd
Skrivet av for_each_while:

@alexander87:

Vet faktiskt inte hur prestandan är. Har inte suttit så mycket med PHP. Men jag tyckte det va ganska enkelt att komma igång med PDO.

Eftersom du gör ett spel antar jag att du har mycket "tärnings rullande" om vem som vinner. Många använder fortfarande rand() men det är mt_rand() som ska användas.

Det superboss skrev skulle jag säga är det bästa sättet att göra det på.

När någon "bakar en kaka" eller "tränar en soldat" så sätter du en tid på soldaten när han är färdigtränad. Om jag sen anfaller dig t.ex. så gör du bara en databas query. SELECT * FROM soldiers WHERE trainingtime < '2015-10-27 09:19:00';
Där läste jag att det kan finnas lite performance issues om du inte skickar in ett datum själv. Det kan du göra med PHP dock.

Ungefär så, men du löser det nog snyggare och bättre!

Har börjat skriva om spelet, gick att få det exakt som jag vill bara genom att byta ut mysql mot pdo, sen har jag gjort så att jag precis som han skrev satt timestamp sen använder jag ett javascript som i realtid när spelaren är inne räknar ner tiden tills "kakan" är klar, funkar perfekt, hur det funkar med några hundra spelare samtidigt, det vet jag inte, det får man se senare vid beta-körning.

Visa signatur

[Intel core i7 5960X 3.0ghz] - [ ASUS X99-DELUXE] - [ 48 GB CORSAIR DDR4 DOMINATOR]- [Asus GTX 980TI SLI] - [Corsair AX1200I] - [Kingston Hyperx Predator 240GB]