[php] Jak zrobic odliczanie w czasie rzeczywistym?

0

Witam.
Grałem kiedyś w traviana i nawet w plemiona i tam pamietam bylo takie cos, że jak sie budowało
to pokazywał się czas odliczający w dół. a po wykonaniu odliczania pojawiał się wynik na stronie.
Nawet jak rośnie suruwka czy inne minerały to bez odswieżania powiększał się licznik.
Nie mam zamiaru robic gry czy cos takiego, Jednak ten mechanizm jest mi potrzebny i mam pytanie.

  1. W czym to wykonać ?
  2. Czy jesli w bazie wpisze ze np pozycja 33 ma byc odliczana przez 15 minut w dół. to czy jest to
    tak zrobione, że system pobiera dany czas do odliczenia w dol i z kazda sekunda aktualizuje wpis do bazy ?
    czy np pobiera dany czas do odliczenia. Pobiera czas dodania do bazy danego przedmiotu i oblicza roznice
    czasowa, ktora nastepnie wysweitla. Jesli roznica jest mniejsza od 15 minut to wysweitla. jesli wieksza to
    wykonuje tak jakby czas sie skonczyl ?
0

Rotfl, co sekundę modyfikować kilka tysięcy rekordów w bazie...
W PHP masz funkcję time(), zwraca ona czas w formacie liczbowym (sekundy od 01.01.1980, czy jakoś tak - mało istotne) jeśli chcesz żeby coś skończyło się za 15 minut, to dajesz przykładowo tabelę:

+--+------------------+------+-----------+
|ID|Nazwa             |Poziom|CzasUpgrade|
+--+------------------+------+-----------+
|2 |Magiczny Wir      |2     |1276323562 |
|3 |Wrota czasu       |0     |1255472344 |

I możesz to zrobić tak:

  1. Kiedy user kliknie na rozbudowę/budowę jakiegoś budynku, zapisujesz mu w bazie taki właśnie rekord jak wyżej (tyle że jeszcze trzeba dodać do kolumn id usera i inne takie), czyli:

ID (wiadomo), nazwa budynku, poziom (jeśli dopiero buduje to poziom: 0) i CzasUpgrade. W ostatnim polu zapisujemy datę finalizacji zadania w formacie UNIXowym. Żeby uzyskać w formacie unixowym aktualną datę wywołujemy funkcję:

time()

Jeśli chcesz żeby budynek tworzył się przez 15 minut to żeby uzyskać taką datę w formacie UNIXowym wystarczy wykonać kilka banalnych działań.

time()+60*15

Liczbę minut mnożymy przez 60, bo data unixowa jest zapisywana w sekundach.

Później wynik podanego wyżej działania zapisujemy w tabeli, nawet nie trzeba żadnego crona. Wystarczy sprawdzać przy każdym odświeżeniu strony czy wartość funkcji time() jest większa od tej zapisanej w bazie. Jeśli tak się stanie to znaczy że 15 minut od zlecenia zadania minęło i można zaktualizować pewne wpisy w bazie.

Przepraszam za chaotyczność, ale czasami mój piątek wygląda tak.

0

To ja dokończę odpowiedź Monk'a.
To że widzisz rezultat jak się coś skończy budować - zwyczajnie, gdy któryś licznik dojdzie do 0 na stronie - robi refresh.

Co do surowców - jeśli wiesz, że surki przybywa 1000 na godzinę, to wiesz, że w minutę przybywa 1000/60, a przez sekundę 1000/60/60 - i co sekunde możesz zwiększać ten licznik o tą wartość. Trochę pokombinujesz z co zrobić z wartością po przecinku i włala(sic!)

0

Zrozumialem , ze od danego powiedzmy zlecenia budowy , wpisujemy aktualny czas (UNIX - sekundy) i dodajemy 15 minut (*60 sekund) w sekundach. I teraz jezeli np otworze strone i bede chcial zobaczyc jak odlicza sie czas to mam uzyc AJAXA?

Algorytm do odliczania

  1. pobieram date do konca budowy dangeo obiektu
  2. jezeli czas mniejszy niz te 15 minut to odczytujmey aktualny czas (UNIX) i odejmujemy od wartosci tej co jest w bazie
    nastepnie wysweitlamy wpostaci minut i senud i odliczamy.

Ale co kazda sekunde musimy dac odswiezanie wszystkch rekordow jakie sa wpisane. czyli np 5 budynkow
to musimy sprawdzac czy czas sie skonczyl i wykonac aktualizacje dla danego budynku poziom wyzej
kiedy juz skonczymy budowac.

Tylko nie moge pobierac dla 5 rekordow kazdy oddzielnie tylko musze pobrac co sekunda Od razu czasy wszystkich
rekordow. Bo przy ilosci np 100 obiektow czy 1000 to by sie (zesralo). I to jak rozumiem juz w ajaxie trzeba by zrobic?

0

Nie co sekundę. Czy tego nie można robić kiedy user odświeża stronę?

  1. Użytkownik zleca budowanie
  2. Pojawia się licznik (w JavaScripcie normalnym, nie żadnym AJAXie -_-) i w bazie zapisywany jest UNIXowy czas ukończenia budowy
  3. Kiedy user odświeża stronę i budynek dalej nie jest zbudowany, to wyświetla mu się dalej licznik (tak jak mówiłeś, odejmowanie aktualnego czasu)
  4. W momencie kiedy user odświeży stronę budowania sprawdzane są jego budowy - czy jakaś już się nie skończyła, a jeśli tak to jest usuwana z listy zadań i zwiększany poziom danej budowli gdzieś tam.

Nie widzę tu takiej rzeczy którą trzeba by koniecznie robić w czasie rzeczywistym. Bo skoro user zlecił budowę, ale nie gra dwa tygodnie, to po co system mają obchodzić jego rekordy? Jak wejdzie po tych 2 tygodniach to dopiero wtedy serwer ma się zczaić że budowa mu się skończyła i zaktualizować odpowiednie rekordy - wtedy kiedy to będzie potrzebne, a nie wtedy kiedy rekord się przeterminuje.

0

Musi sie stac tak ze iedy skonczy siebudowa tak? na przyklad za 15 minut cos wybudejsz co nie? a wejdziesz za tydzien. to jak wybudujesz kopalnie za 15 minut do poziomu 3 i trzci poziom da ci 10 wegla na godzine . Drugi poziom daje 7 wegla. Wiec przez 7 dni powinienes miec 10 na godzine wegla. A jak zrobie po twojemu to 10/h bedzie dopiero od dnia wejscia.

Ja musze miec tak ze jak jestes w systemie i wlaczysz odliczanie to systemu nie zamykasz. A kiedy skonczy sie odliczanie to musi sie samo cos zaktualizowac i przejsc z jednej kolumny do drugiej. WIec musze miec cos co mi co sekunda sprawdzi stan rekordu. Ale nie ze co sekunda bedzie pobieral dane oddzielnie 5 rekordow tylko co sekunda musi pobarac wszystkie dane z aktywnych rekordow i wysweitlic. Zeby serw nie padl

0

Bzdury opowiadasz. Wszystko to da sie obliczyc, tak jak wlasnie obliczyles. Co stoi na przeszkodzie, zeby wyliczyc to w momencie wejscia? Jak chcesz obciazac serwer co sekunde, to nikt Ci nie broni, ale wszystko da sie obliczyc w kazdym momencie. W tych grach nie ma losowosci, wiec kazda sytuacja jest przewidywalna. Rownie dobrze moglbys obliczyc jaki bedzie stan zasobow uzytkownika za 10 miesiecy, przy zalozeniu, ze uzytkownik nie bedzie ingerowal.

0

No fakttycznie ze racja, ze da sie obliczyc jesli uwzglednimy czas ostatniego wejscia czas rozbudowania poziomu itd itd. Ale gra byla tylko przykladem. Chodzi mi o cos takiego ze tak: sa trzy kolumny. W pierwszej jest aktywne zlecenie. w drugiej sa zlecenia potweirdzone w trzeciej zakonczone:

Teraz te aktwne sa ustawione na 15 minut. i jest nap 10 slecen w kolumnie. Od dodania zlecenia odlicza sie 15 minut w dol. Kiedy ktos potwierdzi zlecenie w ciagu 15 minut to musi ono zniknac z pierwszej kolumny i przejsc na druga. Jesli zlecenie minie czyli czas sie skonczy ma przeskoczyc na trzecia kolumne. dlatego musze sprawdzic co sekunde jaki ejst stan zlecen. ale jesli jest 15 zlecen o stan co sekunde musi dotyczc wszystkich naraz. eeh juz sam nie wiem jak by to liznac

0

Ta sama sytuacja. Sprawdzasz czy w momencie potwierdzenia od zlozenia zlecenia minelo 15 minut czy nie. Masz 2 sytuacje:

  1. Uzytkownik potwierdza przed uplywem 15 minut - update do drugiej kolumny
  2. Po 15 minutach - update do trzeciej kolumny.

Cos sie tak uparl na zarzynanie serwera?

0

Bo chodzi o to ze tak:

  1. dodaje sobie zlecenie tak? i mam linijke w lewej kolumnie ze zlecenie konczy sie
    za: 1233 i czas leci do dolu. Teraz np ktos inny sobie wejdzie i np ta druga osoba
    wcisnie ze zlecenie pobiera tak? wiec teraz ja, ktory dodalem zlecenie chce zobaczyc ze zostalo ono do realizacji czyli powinno mi zniknac z lewej kolumny.

Schemat jest taki:

  1. osoba (A) dodaje zlecenia
  2. Osoba (B) ,(C) itd moga pobierac zlecenia
  3. Osoba (A) musi wiedziec co sie dzieje ze zleceniami wiec co sekunde musi sie
    osobie (A) odswiezac informacja czy zlecenie ma sie wyswietlac w pierwszej kollumnie
    i jeszcze odlicac? czy ma sie zlecenie zamkanc? bo nikt go nie wzial lub czy zlecenie jest
    wziete i ma go nie wysweitlac w tej kolumnie

Czy na powyzsze zadanie jest jakis inny spososb czy musze wybierac te dane z serwera co sekunde?

0

Nie musi się co sekundę odświeżać czas do zamknięcia zlecenia, omg... Przecież od tego jest skrypt JavaScript żeby ci odliczał, a jak się skończy to odświeżył stronę bez nagabywania serwera. No chyba że chcesz widzieć jakie komentarze dodają klienci do zlecenia (czy coś w ten deseń) no to musisz odświeżać tą informację z AJAXa, ale nie co sekundę, tylko co 5-10 sekund.

0

Przesledzmy sytuacje na modelu:
Mamy w kolumnie z lewej str 5 zlecen:

  1. 0013
  2. 0011
  3. 0012
  4. 0001
  5. 0017

W bazie te 5 zlecen ma status OTWARTE. I teraz zakladamy ze ktos pobral zlecenie nr 3.
wiec teraz na stronie powinno byc tak:

kolumna lewa zlecenia otwarte kolumna srodkowa zlecenia pobrane

  1. 0013 3. 0011
  2. 0011
  3. 0001
  4. 0017

Jak widac zlecenie nr 3 zostalo zaakceptowane przed czasem. I teraz musze widziec wlasnie
te zlecenia ktore zostaly przeniesone. Mysle ze 5 sekund to czas akceptowalny czy nawet 15 sekund
ale jak rozumiem to co pisaliscie. Musze co 15 sekund odpytywac serwer? o stan aktualnych zlecen tak?
Jesli tak to najlepiej w AJAXIE zeby nie przeladowywac strony.

0

No w tym wypadku trzeba, jeśli ktoś inny niż ty cośtam zrobi w bazie to trzeba odpytywać serwer.

0

Ale najwazniejsze ze sie potweirdzilem w moim obczajeniu co i jak. Podsumowujac:

  1. Zapisuje do bazy czas aktualny + 15 minut ktore chce dodac
  2. Pobieram z bazy czas i czas aktualny a roznica to nasz czas do konca
  3. Odpytuje baze danych co 15 sekund w zapytaniu wysylam wszytskie aktywne obiekty
  4. Odpytuje baze przy odsweizaniu strony
  5. Aktualizuje baze wprzypadku gdy skonczy sie czas odliczania jakiegos obiektu
  6. odpytuje baze po zakonczeniu odliczania czasu jakiegos dowolnego obiektu
  7. Odpytauje baze przy logowaniu do systemui przejsciu na zakladke ZLECENIA

Mysle ze to na razie wszystko co mi sie udalo przemyslec. Jesli cos jeszcze powinno byc to
prosze o wskazowki. Dziekuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1