• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zrobiłem sobie mini crona co minutę :)

Object Storage Arubacloud
0 głosów
1,035 wizyt
pytanie zadane 9 czerwca 2015 w Nasze projekty przez makoso Mądrala (7,380 p.)
edycja 9 czerwca 2015 przez makoso

Witam zrobiłem sobie mini crona tak od tak :) co sądzicie o takim rozwiązaniu planuję zastosować to do stworzenia gry przeglądarkowej podobnej do plemion :) 
oczywiście kod można uczuplić jest w nim kilka niepotrzebnie powtarzających się rzeczy ale jest to wynik błędów jaki się mi pojawiały :) 
zbudowałem to z wykorzystaniem bazy która pełni u mnie funkcję timera :)

oczywiście to działa tylko wtedy kiedy skrypt jest otwrzony.

poniżej kod 

<?php
 
	try
	{
		//łączenie z bazą itd		
	}
	catch (PDOException $e)
	{
		
	}
	$qub    ="SELECT * FROM skrypt";
    $q=$polacz->query($qub);				
	while($r=$q->fetch(PDO::FETCH_OBJ))
		{
			$min=$r->min;
			$war=$r->war;
		}
	$x=$min;
	$y=date("i");
	$klucz=456;
	$war=$war+1;
	$z=$y;
	if($x<$y)
	{
		$qub    ="UPDATE skrypt SET min = '$z' WHERE klucz = ? LIMIT 1";
        $q = $polacz->prepare($qub);
        $q->bindParam(1, $klucz, PDO::PARAM_INT);
        $q->execute();	
		$qub    ="UPDATE skrypt SET war = '$war' WHERE klucz = ? LIMIT 1";
        $q = $polacz->prepare($qub);
        $q->bindParam(1, $klucz, PDO::PARAM_INT);
        $q->execute();				
		header('refresh: 10;');
		echo 'dziala update';
	}
	elseif($x==$y){header('refresh: 10;');echo 'dziala przekierowanie';}	
	elseif($x>$y)
	{
		$qub    ="UPDATE skrypt SET min = '$z' WHERE klucz = ? LIMIT 1";
        $q = $polacz->prepare($qub);
        $q->bindParam(1, $klucz, PDO::PARAM_INT);
        $q->execute();	
		echo 'dziala naprawienie';
		header('refresh: 10;');
	}	
	$warn=$war+1;	
	echo 'nowa minuta: '.$z.'<br/>';
	echo 'minuta: '.$y.'<br/>';
	echo '<br/>nowa wartośc: '.$war;
	echo '<br/>następna wartośc: '.$warn;
	$czas=date('Y.m.d g:i:s');
	echo '<br/><br/>czas serwera: '.$czas;
?>

 

2 odpowiedzi

0 głosów
odpowiedź 9 czerwca 2015 przez Geek Pasjonat (19,660 p.)
Co dokładnie ma realizować ten kod w grze?
komentarz 9 czerwca 2015 przez makoso Mądrala (7,380 p.)
tam gdzie teraz jest zwiększana wartość bedzie większa funkcja odpowiadająca za zwiększanie ilości posiadanych surowców na podstawie budynków wydobycia mam nadzieję że uda mi się ogarnąć skrypty jak będzie działało to może nawet w jakąś grafikę się pobawię ;)
komentarz 9 czerwca 2015 przez Geek Pasjonat (19,660 p.)
A nie lepiej obliczać to na sekundy i zamiast crona po prostu wrzucić do podstron gry kod obliczający przychód surowców i dodający je do bazy? :)
komentarz 9 czerwca 2015 przez makoso Mądrala (7,380 p.)
tak ale to by działało gdyby 1.ruch w grze byłby duży (cały czas ktoś miałby otwartą jakąś podstronę) nie wiem czy to dobry pomysł ale chcę zrobić tu maszynkę która będzie obsługiwała wszystkich użytkowników zwiększe odświeżanie skryptu na 30s tak abym miał pewność że się przemieli skrypt ;)
nie wiem czy dobrze się za to biorę ale jakieś doświadczenia po-tym zdobędę być może będę miał co robić w wakację bo mimo że szukam miejsca na jakieś praktyki bądź innego miejsca gdzie mógłbym szlifować programowanie to wynik jest zerowy więc będę musiał bazować na swoich projektach :)

mam do Ciebie pytanko pewnie wiesz więc mi pomożesz dotyczy prawdopodobnie relacji wstawiania rekordu jak chcę coś dodać do 2 tabel różne dane to mogę to zrobić na zasadzie konstrukcji tabel1.kolumna=jakieś dane tabela2.kolumna=jakieś dane czy muszę robić tak jak robię dotej pory poprostu pisząc dwa oddzielne zapytania ?
komentarz 9 czerwca 2015 przez Geek Pasjonat (19,660 p.)
Raczej musisz to robić w osobnych zapytaniach, ewentualnie napisać funkcję, do której podasz tylko dane a ona sama wygeneruje zapytania.

Właśnie o to chodzi, że nie musi być nikt online. Kiedy ktoś odświeża stronę, obojętne jaki user to obliczana jest różnica w sekundach od ostatniego odświeżenia i na tej podstawie obliczany  przychód surowców.
komentarz 10 czerwca 2015 przez makoso Mądrala (7,380 p.)
Nie o tym pomyslałem :)
Super pomysł!

Postaram się wykonać to w ten sposób ale z drugiej strony czy to nie będzie zbyt cięzkie dla serwera przy każdym odświeżeniu strony przez użytkownika będzie update szedł może lepiej to zamknąć w if jeżeli różnica większa niż 10 kalkulejted i wstaw ale też jednak czy to nie opóźni zbytnio ładowania strony? :)

Dodatkowo pytanie (dzięki że odpowiadasz mi na poprzednie) co sądzisz o wyświetlaniu błędów przy logowaniu jak przy rejestracji poprzez alert js? ja osobiście nie lubię wyświetlać obok pól ew zastanawiałem się nad wyświetlaniem w polach wygląda to chyba w miarę ostetycznie :)
komentarz 10 czerwca 2015 przez Geek Pasjonat (19,660 p.)
Ja osobiście preferuje wyświetlanie przy formularzu, ale to już zależy jak Ty wolisz. Jakieś ładne okienko dialogowe w js-jQuery też mile widziane.

Co do wydajności to na 100% Ci nie mogę powiedzieć. Wiadomo że jeśli nie potrzebujesz tej aktualizacji sekundowej to wydajniejsze będą crony, tylko problem pojawia się np. jak wprowadzisz możliwość budowania. Tutaj cron już się średnio sprawdza.

Na swoim przykładzie powiem że przy kilkudziesięciu userach baza dawała radę z odświeżaniem stanu surowców, finalizacją zleceń budowania oraz atakami.

Możesz  to teoretycznie na kilka sposobów zoptymalizować np. jeśli aktualizacja danego rekordu w bazie danych nie ma wpływu na innych graczy np. ilość drewna bo z jakiegoś powodu gra nie pozwala na kradnięcie drewna, no to wtedy nie ma sensu żeby inny gracz aktualizował ilość drewna innego gracza. Wtedy taką aktualizacje przeprowadza gracz, który otrzymuje to drewno.

Mam nadzieje że dobrze wyjaśniłem. :)
komentarz 10 czerwca 2015 przez makoso Mądrala (7,380 p.)
budowanie zrobię też na bazach zapisując czas zlecenia budowy i koniec i to podepne po zalogowaniu aby się aktualizowało gdy gracz się zaloguje

 

surowce ogarnę z kradnięciem tylko jeszcze nie wiem jak to przeprowadzę ale ataki beda bez mapki chyba bo to będzie dla mnie nie do ogarnięcia :) poprostu rozbudowa osady punkty mierzenie się z losowym graczem bądź wybranym itp mam nadzieję że będzie to sprawnie działało :)
komentarz 10 czerwca 2015 przez Geek Pasjonat (19,660 p.)
Powodzenia :)
komentarz 13 czerwca 2015 przez makoso Mądrala (7,380 p.)

udało mi się ugryźć temat z budynkami dającymi surowce do gry :) mój mini cron się sprawdza póki co testuję na swoich 2 urzytkownikach jutro dodam na próbe 100 i zobaczę czy bardzo spowolni 100 użytkowników :) teraz działa w normalnej prędkości poniżej kod jak to sobie zastosowałem :)

 

<?php
	$qub    	="SELECT * FROM skrypt WHERE klucz=456";
    $q		=$polacz->query($qub);				
	$r			=$q->fetch(PDO::FETCH_OBJ);
	$min		=$r->min;
	$x			=$min;
	$y			=date("i");
	$klucz	=456;
	$z			=$y;
	if($x<$y)
	{
			$qub	 	="UPDATE skrypt SET min = '$z' WHERE klucz = ? LIMIT 1";
			$q 		= $polacz->prepare($qub);
			$q->bindParam(1, $klucz, PDO::PARAM_INT);
			$q->execute();	
			$qub		 ="SELECT * FROM uzytkownik";
			$q		=$polacz->query($qub);				
		    	while($r=$q->fetch(PDO::FETCH_OBJ))
		    	{
					$id						=$r->id_gracz;	
					$budynki_pyt			="SELECT * FROM budowle where gracz_posiadajacy = '$id' ";
					$budynki_wykonaj	=$polacz->query($budynki_pyt);
					$budynki_wynik		=$budynki_wykonaj->fetch(PDO::FETCH_OBJ);
					$lvl_tartak				=$budynki_wynik->tartak;
					$lvl_miennica			=$budynki_wynik->miennica;
					$lvl_kopalnia			=$budynki_wynik->kopalnia;
					//LVL BUDYNKI ODEBRANE
					$wydobycie_drewna_pyt			="SELECT * FROM skrypt where budynek = 'tartak' AND lvl_budynku = '$lvl_tartak' ";
					$wydobycie_drewna_wykonaj	=$polacz->query($wydobycie_drewna_pyt);
					$wydobycie_drewna_wynik		=$wydobycie_drewna_wykonaj->fetch(PDO::FETCH_OBJ);
					$wydobycie_drewna					=$wydobycie_drewna_wynik->wydobycie;					
					$wydobycie_zlota_pyt				="SELECT * FROM skrypt where budynek = 'tartak' AND lvl_budynku = '$lvl_miennica' ";
					$wydobycie_zlota_wykonaj		=$polacz->query($wydobycie_zlota_pyt);
					$wydobycie_zlota_wynik			=$wydobycie_zlota_wykonaj->fetch(PDO::FETCH_OBJ);
					$wydobycie_zlota						=$wydobycie_zlota_wynik->wydobycie;					
					$wydobycie_kamienia_pyt			="SELECT * FROM skrypt where budynek = 'tartak' AND lvl_budynku = '$lvl_kopalnia' ";
					$wydobycie_kamienia_wykonaj	=$polacz->query($wydobycie_kamienia_pyt);
					$wydobycie_kamienia_wynik		=$wydobycie_kamienia_wykonaj->fetch(PDO::FETCH_OBJ);
					$wydobycie_kamienia				=$wydobycie_kamienia_wynik->wydobycie;
					//WYDOBYCIE DLA LVL-I UZYTKOWNIKA ODEBRANE
					$dodaj_drewno		=$wydobycie_drewna / 60;
					$dodaj_zloto			=$wydobycie_zlota / 60;
					$dodaj_kamien		=$wydobycie_kamienia / 60;
					//ILE SUROWCOW DODAC CO 1 MIN WYKONANE
					$stan_pytanie		="SELECT * FROM surowce WHERE id_uzytkownika='$id' ";
					$stan_wykonaj		=$polacz->query($stan_pytanie);
					$stan_wynik			=$stan_wykonaj->fetch(PDO::FETCH_OBJ);
					$stan_drewno		=$stan_wynik->drewno;
					$stan_zloto			=$stan_wynik->zloto;
					$stan_kamien		=$stan_wynik->kamien;
					//AKTUALNY STAN SUROWCÓW ODEBRANO
					$nowe_drewno		=$stan_drewno + $dodaj_drewno;
					$nowe_zloto			=$stan_zloto + $dodaj_zloto;
					$nowe_kamien		=$stan_kamien + $dodaj_kamien;
					//PRZYGOTOWANO NOWĄ ILOŚĆ PRODUKTÓW

						$aktualizuj    			="UPDATE surowce SET drewno = '$nowe_drewno', kamien = '$nowe_kamien', zloto = '$nowe_zloto' WHERE id_uzytkownika = ?";
						$aktualizuj_dodaj 	= $polacz->prepare($aktualizuj);
						$aktualizuj_dodaj->bindParam(1, $id, PDO::PARAM_INT);
						$aktualizuj_dodaj->execute();						
				
				}
			
			header('refresh: 10;');
			echo 'dziala update';
	}
	elseif($x==$y){header('refresh: 10;');echo 'dziala przekierowanie';}
	
	
	elseif($x>$y)
	{
		$qub   		 ="UPDATE skrypt SET min = '$z' WHERE klucz = ? LIMIT 1";
		$q 			= $polacz->prepare($qub);
		$q->bindParam(1, $klucz, PDO::PARAM_STR);
		$q->execute();	
		echo 'dziala naprawienie';
		header('refresh: 10;');
	}
?>

 

0 głosów
odpowiedź 9 czerwca 2015 przez Comandeer Guru (601,110 p.)
W skrypcie plemion demon mieli wszystko na okrągło i nie był napisany w PHP a jako osobna aplikacja konsolowa. W nieskończonej pętli przerabiał wszystko, co szło z bazy i do bazy.

Równie dobrze można odpalić program napisany w PHP z konsoli.

Inne pytanie brzmi: ile wytrzyma baza?
komentarz 9 czerwca 2015 przez makoso Mądrala (7,380 p.)
do zwykłego urzytku (nie jest to robione na cały świat pewnie uda mi się namówić kilku znajomych do zabawy :) ) to baza tego nie odczuje zbytnio kod ma za zadanie zwiększyć (edytować wszystkim rekordy posiadanych surowców dałem sobie zakres na minutę teraz odświeżam skrypt co 10s ale mogę to dać i co 30s skrypty jak i baza tego nie odczują nawet  w końcu nie jest to profesjonalna robota aczkolwiek lubię obierać sobie podobnego typu cele bo przyjemniej leci nauka zawsze potrzeba czegoś nowego :)

Podobne pytania

+4 głosów
4 odpowiedzi 1,023 wizyt
0 głosów
1 odpowiedź 519 wizyt
pytanie zadane 4 marca 2018 w Nasze projekty przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 217 wizyt

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...