Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie akcji po określonym czasie
Forum PHP.pl > Forum > PHP
Hectic
Witam,
zastanawiam się jak działają gry tekstowe. Dokładnie chodzi mi o coś takiego. Płynie statek ze złotem na inną wyspę... będzie tam za 18 min... gdy dopłynie gracz dostaje wiadomość o rozładowaniu złota. Jak rozwiązać coś takiego? Jedyne co przychodzi mi do głowy to cron... i ustawianie go z poziomy php... Statek zaczyna płynąć o 18.05 więc akcja zakończy się o 18.23 i taki wpis dodajemy do crona... ale przy dużej ilości graczy i akcji to chyba dość bolesne dla serwera... czy ma ktoś inny pomysł?
Synapsa
W bazie dodajesz czas zakończenia,a pózniej tylko sprawdzasz z akutalnym czasem.
A żeby było płynnie to js.
sniezny_wilk
No co Ty smile.gif tam jest minimalna ilość crona, wszystko jest przeliczane po stronie serwerowej w momencie odświeżenia. Działa to tak:

1. Wysyłasz statek, pobierana jest wartość czasu potrzebna na dotarcie, zapisywana jest np w MySQL, oraz ładowana do funkcji JS która odlicza czas u Ciebie na bieżąco.
2. Przy każdym odświeżeniu jest ładowany aktualny czas do JS'owych funkcji aby sprawdzić czy jest dobry i go skorygować, sprawdzany jest również czas i jeden if.. Czy czas wypłynięcia + czas potrzebny do dopłynięcia jest >= od czasu który jest teraz jeśli tak, to jest wywoływana zdarzenie.
3. Także mimo, że się skończył czas płynięcia nie jest generowany żaden efekt, dopiero jak odświeżysz okno, lub odświeżenia wykona skrypt dopiero zobaczysz wynik
4. Tak jest przeliczana cała gra, cron jest zbędny.
Babcia@Stefa
Może źle zrozumiałem, myślę że można to też tak rozwiązać jak się generuje masowe statystyki w tle:

  1. <?php
  2. if(!is_file('statek.xml') OR (time()-filemtime('statek.xml')) > 100)
  3. {
  4. $socket = fsockopen('localhost', $_SERVER['SERVER_PORT'], $errorCode, $errorString, 1);
  5. if ($socket === false){
  6. echo 'Statek się rozwalił gdzieś na skałach, zatonął jak tytanic. Za chwilę wyślemy nowy ;)';
  7. } else { 
  8. $url = 'GET statek.php '.$_SERVER['SERVER_PROTOCOL']."r\n";
  9. fwrite($socket, $url);
  10. fwrite($socket, 'Host: '.$_SERVER['HTTP_HOST']."r\n");
  11. fwrite($socket, 'User-Agent: Tajne_dane'."r\n");
  12. fwrite($socket, 'Content-Length: 0'."r\n");
  13. fwrite($socket, "r\n");
  14. fclose($socket);
  15. }
  16. echo 'Statek jeszcze nie przypłynął.';
  17. } else {
  18.  echo 'Statek gotowy...';
  19. }
  20. ?>


Kiedyś używałem takiego kodu do masowego generowania statystyk.
Pamiętaj aby sprawdzać datę pliku w wywoływanym pliku statek.php, inaczej kilka osób otworzy stronę naraz i masz po serwerze (przeciąrzenie).
Sprawdzaj User-Agent (ustal dowolny zamiast Tajne_dane, to może służyć jako hasło.)

Myślę że pomogłem smile.gif

Dziękuję, Babcia@Stefa
Hectic
Dzięki za pomoc Panowie, chyba już wiem o co chodzi biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.