ďťż

[php/mysql] Jak wykonac skrypt php o określonym czasie

       

Podstrony


telcocafe

Jeśli ktoś grał w ogame, to napewno zauwazył ze jesli jego flota doleci do planety to wykonuje sie jakiś skrypt który zmienia zawartośc bazy danych(powiedzmy mysql) nawet jesli gracz jest offline. Chodzi mi o to zeby wykonac skrypt php który modyfikuje baze danych o jakims tam zadanym czasie, obliczanym z koleji przy pomocy inego skryptu, co jest w tym przypadku wydaje mi sie mniej istotne.
Użytkownik odrin edytował ten post 09 październik 2006, 11:55


cron.

Jeśli Twój serwer tego nie obsługuje to poszukaj jakiegoś publicznego (np webcron.org)
Użytkownik Einzeinbleth edytował ten post 09 październik 2006, 12:04

Jeśli Twój serwer tego nie obsługuje to poszukaj jakiegoś publicznego (np webcron.org)
tak, ale webcorn pozwala mi wykonac skrypt o okreslpnej porze, np o godz 3:45 a ja nie wiem kiedy dokladnie ten skrypt ma zostac wykonany - "flota przylatuje o godz 2:23" ale jest to uwarunkowane szeregiem czynników, rodzajem silnika, technologia, predkoscia, itp, czyli nie wiem kiedy dokładnie przyleci w momencie pisania skryptu, dopiero ingerencja gracza ustala pewien czas, a mój skrypt o okreslonej poze zmienia wartosc w bazie - 'flota leci' na 'flota wyladowała'.
Ps. grałem w twoja gre, niezła nawet - mysle nad czyms podobnym...
Użytkownik odrin edytował ten post 09 październik 2006, 12:25
No to niech przygotowany skrypt (na którego cron ma wchodzić powiedzmy co 10 minut) sprawdza które floty powinny już dolecieć (flota wylądowała) a które jeszcze lecą (flota leci). Serwer ogame zapewne pozwala zaszaleć i ustawić crona nawet na kilka sekund, ale opiera się na tym samym założeniu. Te 10 minut dla prostej gierki to imho wystarczająca częstotliwość.

Jest też kilka innych serwisów- przykładowo http://www.cronjob4you.at/. Sprawdź gdzie można ustawić najczęstsze odwiedziny crona.

edit:
oo nie, właśnie wszedłem na stronę cronjob4you i się zorientowałem że zamykają :/ będę musiał poszukać innego dostawcy... esh, a dobry był to serwis, od paru miesięcy bez zarzutów..
Użytkownik Einzeinbleth edytował ten post 09 październik 2006, 12:33


W jiyuu po kliknieciu na np. strzałke z funkcja ruch w lewo po odswierzeniu ekranu gracz znajdował sie juz w nowym polozeniu - to nie wymagało zadnego 'crona'. ja mysle nad podobna metoda z tym ze mozna kliknac na dowlonym kwadracie i skrypt oblicza najkrótsza droge do tego miejsca(omijajaca rózne porzeszkody). teraz gracz ma np zmienna predkosc ustawiona na np 1 min - tyle na 1 lv potrzebuje na przejscie z kwadratu w którym sie znajduje do kwadratu po lewej stronie(poruszanie sie w innym srodowisku byłoby wolniejsze). I po odswierzeniu ekranu gracz znajduje sie nadal w tym samym miejscu z tym ze po najechaniu na niego myszka pokazuje sie menu a w nim info "gracz xxx porusza sie na zachód pozostało xx sekund". Taki mały zarys ;)

Z tym że w jiyuu poruszałeś się tak szybko jak się przeładowywała strona ;) po prostu, kliknięcie -> zmodyfikowanie bazy danych -> wyświetlenie nowego położenia, finito.
W takim wypadku, jak przedstawiłeś już jest trudniej - albo to zrobisz przy pomocy crona jak już opisałem, albo mam inny pomysł, właśnie na niego wpadłem (chociaż w jiyuu też to użyłem ^^)
Przypuśćmy, że chcemy się poruszyć o dwa pola (to są dwie minuty). Wtedy skrypt pobiera aktualny czas serwera i zapisuje do bazy danych (np w polu "start_time"), a także po kilku obliczeniach (by doliczyć czynniki typu poziom postaci, teren etc) zapisuje w polu "finish_time" kiedy gracz dojdzie na miejsce. Następnie, przy każdym odświeżeniu strony (czy dowolnego miejsca gry, whatever) sprawdzane jest czy gracz już powinien dojść na miejsce (aktualny czas >= finish_time) - wtedy zapisujemy w bazie danych że gracz już jest gdzie być miał i finito. Gdy jeszcze nie ten czas, to nadal wyświetlamy "gracz jest w drodze, za XXX sekund/minut będzie na miejscu.
To jest proste i nawet nie wymaga crona - mniejsze obciążenie dla serwera. A graczowi to "rybka" czy jest tak czy inaczej zrobione - i tak zobaczy jedynie "doszedłeś" albo "czekaj".
Powodzenia =]

ps. jak co to 80% kodu jiyuu jest dostępne bezpośrednio ze strony - na dole jest link "źródło" - pokazuje źródło aktualnie załadowanego plugina (np walki, shoutboksa, forum, mapy etc etc)
Użytkownik Einzeinbleth edytował ten post 09 październik 2006, 12:57
Tez nad tym myslałem, gdyz cron musiałby pracowac 24/h odswierzajac skrypt co 1s. Jednak to byłoby strasznie obciazajace dla serwera. Poprostu role crona beda pelnic gracze którzy bedą uruchamiac skrypt ale nie dla całego swiata(co było by zbyt wolne) tylko dla danego miniuni (200/200 pól). Myse tez nad zrobieniem kolejki zdarzen(bufora zdarzen) który bedzie trzymał zdarzenie i czas o jakim zosyanie ono zakonczone. Jesli aktualny czas jest "mniejszy" od czasu wykonania zadania to zostanie wyswietlony licznik, jesli wiekszy, to zostanie wykonane zadanie i usuniete z kolejki, problem bedzie jesli 2 uzytkownicy odswierza skrypt jednoczesnie, jeden wykona go i usunie, drugi spr wykonac - "ciach" blad bo juz gracza nie ma pod podanym adresem, i usunoie - "ciach" nie ma co usunac!

Mhm ale ja tu naprawdę problemu nie widzę - żaden bufor zdarzeń nie jest potrzebny.
Po pierwsze, szanse że dwóch graczy jednocześnie odświeży skrypt są minimalne;
Po drugie, z reguły może być kilka połączeń do bazy danych i kilka/naście zapytań wykonywanych jednocześnie;
Po trzecie, szansa że dwóch graczy jednocześnie zakończy "podróż" jest również minimalna. Liczymy te minuty indywidualnie dla każdego, od czasu gdy zaczął do czasu gdy ma skończyć.
Po co ten bufor zdarzeń? Gracz odświeża stronę - pobierane jest tylko to, kiedy ten jeden konkretny gracz kończy podróz [i czy ją odbywa etc etc] - i jeśli trzeba to jest wykonywane dodatkowe zapytanie, ustawiające mu status "dotarł na miejsce".

Swoją drogą - polecam ten temat:
http://forum.ks-eksp...t...=73081&st=0
który mi bardzo pomógł w tworzeniu =]

Nie bo widzisz, zalózmy ze mamy mapkę która jest widoczna na ekranie. Ma 10/10 pól. w srodku jest nasz gracz, jakis gracz("janek") ma misje przejscia przez te 10 pól ze wschodu na zachód i podozac w innym bóg wie jakim kierunku. Nas interesuje fakt ze przejdzie przez te 10 pól. Oczywiscie gracz który "steruje" jankiem jest offline(dał misje jankowi i zwial) teraz kto ma uaktualniac baze danch janka jak on jest offline? robi to nasz gracz jak tylko razem z bazami graczy którzy koliduja z jego zasiegiem wzroku. Tym samym musimy miec bufor zadan wszystkich graczy ale tylko w tzw MiniUni - 200/200 pól, kiedy gracz wyjdzie z tego kwadratu to jakby wchodził do innej krainy, "podległej" innemu buforowi zdarzen. Przynajmniej ja to tak widze.

Ps. mam pytanie, jak zmieniasz awatar? Sciezka jest stała: http://jiyuu.info/avatar.png w jaki sposób podminiasz grafike?
Użytkownik odrin edytował ten post 09 październik 2006, 14:26
A czy nie prościej /wydajniej, szybciej, ładniej, bardziej kolorowo/ zrobić tak jak napisałem?
Gracz powiedzmy kliknął sobie, i ma 10 pól (10 minut) do przejścia, wtedy też wyłącza przeglądarkę i idzie do sklepu. Skrypt w momencie kliknięcia zapisał aktualną datę, obliczył kiedy dojdzie na miejsce przeznaczenia i zapisał w innym polu bazy danych.
Teraz gdy Janek wróci po 5 minutach, zobaczy że jeszcze 5 minut będzie trwała podróż (nadal mamy w bazie danych zapisane "na sztywno" kiedy dokładnie się zakończy podróż).
Gdy wróci po 15 minutach, to zobaczy przykładowo - gratulacje, jesteś gdzie polazłeś. Twoja podróż się zakończyła o tej i o tej godzinie, czyli X minut temu.
Nie ma sensu imho sprawdzanie czy gracze w okolicy nie powinni już być na miejscu - niepotrzebnie obciąża to tylko serwer. Można [warto] to co prawda zrobić w pewnej sytuacji - gdy już nasza postać osiągnie swój cel podróży (to by umożliwiło np. atak). Ale gdy się okazuje że to jeszcze nie ten czas - nie ma sensu interesować się innymi graczami. Wystarczy że gracz którego to interesuje wywoła zdażenie zakończenia podróży - albo zobaczy że jeszcze nie teraz.

ps. Avatar - skrypt php o nazwie index.php umieszczony w katalogu o nazwie avatar.png =]
Losuje obrazki z własnego katalogu i za pomocą GD wysyła jeden z nich do przeglądarki.
Użytkownik Einzeinbleth edytował ten post 09 październik 2006, 14:30
Nie jestem pewien czy to nie jest juz offtopic(przez samego autora) ale widzisz, podczas pokonywania tych 10 pól janek bedzie przeskakiwał z pol do pola z 1 min gracz stajacy po srodku przytrzymuje myszke na polu w którym znajduje sie janek, pisze mu ze do przejscia do kolejnego pola zostało mu 30s, w tym momencie moze wyciagnac łuk i oddac strzał w strone janka (i tutaj mały paragraf - kiedy gracz zostanie trafony z łuku badz czarem zatrzymuje sie i nie kontynuuje dlaszej podruzy) podejsc i go pociac mieczem, ale jesli minie te 30s to juz zadna funkcja(atak) nie bedzie mozliwy - janka juz tam nie ma, jest gdzie indziej, gdzie? odswierz to sie dowiesz. i widzisz janek sie przesunał. jest teraz w innym polu i ma nowy czas na przejscie z pola do pola. Ale gdyby gracz który steruje jankiem dał mu misje przejdz 10 pól, poszedł do sklepu, i wrucił za 10 min(w tym czasie nikt by nie odswierzał skryptu) i zobaczyłby poprostu janka 10 pól dalej. Proste...tak mi sie wydaje :huh:

A, no widzisz, jeśli chcesz pójść tą drogą to jak najbardziej, Twoje rozwiązanie, ze sprawdzaniem całej okolicy jest koniecznością. Myślałem że chodzi Ci raczej o proste wysłanie ludka w pewne miejsce by dotarł tam w odpowiednim czasie.
Jeśli jednak chcesz to w ten sposób zrobić to imho są dwa rozwiązania:
1) Normalne, zwykłe o jakim mówiłeś - sprawdzanie czy ktoś w okolicy nie powinien zakończyć podróży, gdzie ktoś jest etc. Będzie to niezwykle trudne do wykonania - głównie dlatego że mamy do dyspozycji jedynie protokół http i przeglądarkę. Co jeśli ktoś o niezwykłej szybkości nagle wejdzie do "krainy" gościa który się porusza bardzo powoli? Jaki będzie efekt? Albo ogólnie - gdy będą miały inne szybkości? Wtedy jedna z osób gdy się dowie że gdzieś w okolicy jest inny gracz, to jak ma atakować? Nie wie przecież jak szybko się porusza, nie wie nic, i musi na ślepo odświeżać stronę. Poza tym, co jeśli gracz chciał najpierw iść 3 pola na północ, potem skręcić na wschód i po pokonaniu 5 pól zawrócić na południe? To będzie niezwykle trudne w implementacji.
- Możesz się pokusić o rozwiązanie które podam niżej (2)
- Zrobić natychmiastowe ruchy (o 1 pole, a pól by było duuuużo) co jest proste w utworzeniu i dosyć efektywne
- Połączyć powyższą metodę z tym nad czym się rozwodzimy - wiele pól na raz, z tym że w czasie podróży byłyby ew. postoje jedynie co X kratek (mamy się poruszyć o 15 kratek - postoje są co 5 - wtedy nasza postać się pojawi w polach 0 [0 minut], 5 [po 5 minutach], 10 [po 10 minutach] oraz 15 [po 15 minutach, podróż zakończona]. Wtedy też ew. atakujący by miał sensowny czas na zaatakowanie
- Nie mam pomysłu...

2) Z innej beczki, na ekranie gry byłby niewidoczny "skrypt" flasha który by się łączył ze standardowym serwerem (napisanym np. w C i uruchomionym na koncie shell) i cała gra by się opierała na wysyłaniu komend do tej niewidocznej animacji flash za pomocą javascript.
Imho to ostatnie jest najlepsze, ale też najtrudniejsze. Wprowadza też pewien "świeży powiew" i rozwiązuje wiele problemów:
- Od razu widać kiedy gracz się wylogował
- Możliwa szybka animacja połączona z rozwojem postaci, statystykami etc - możliwe wszystko to, co w normalnych, programowych klientach

Poza tym, ma to ten plus że zamiast flasha można użyć np. javy. A od biedy nawet ajax + php.

Z założenia ma to byc uniwersalne - ktos moze nie miec flasha, moze sie długo ładowac.
W dodatku flash mi sie nie podoba.
Wpadłem na inny pomysł - poprostu po okreslonym czasie kod javascript bedzie przenosił grafike z pola do pola, jesli gracz bedzie ultra szybki( = w grze nie bedzie mozna poruszac sie szybciej niz klataka na 10sekund - wystarczajaco by kliknac i oddac strzał - co i tak w porównaniu z np ogame to szok) to oprostu pokona cała plansze w 1 min co 10s skok - skok - skok... - skok -znikł cool jesli sie zrobi animowanego (gif) biegnacego elfa. Ale flash tez mógł by byc. Albo zrobic tabelke na divach z relatywnymi współżednymi która bedzie sie przesówac po planszy, a wniej grafika z koleji przytrzymojac na tej ramce myszke pojawia sie menu i mozna wybrac np atak, beda tam tez jakies informacje. <- ale to juz podchodzi pod ajax - czyli ultra trudne rzeczy... takie lubie :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.