Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Podwójne wykonawanie skryptu przy obciążeniu
Forum PHP.pl > Forum > Przedszkole
Deusx
Witam !

Mam w serwisie system przeliczania niektórych elementów, ogólnie jest on ustawiony co 3 sek (poprzez bazę danych). W skrócie wygląda to tak:

  1. $przylot = doquery("SELECT * FROM {{table}} WHERE `fleet_end_time` <= '".time()."' AND `fleet_mess` > '0' ORDER BY `fleet_end_time` ASC ", 'fleets');
  2. if($przylot) {
  3. doquery("LOCK TABLE {{table}}aks WRITE, {{table}}lunas WRITE, {{table}}rw WRITE, {{table}}errors WRITE, {{table}}messages WRITE, {{table}}fleets WRITE, {{table}}planets WRITE, {{table}}galaxy WRITE ,{{table}}users WRITE, {{table}}statpoints WRITE, {{table}}push WRITE, {{table}}ignore WRITE", "");
  4.  
  5. while ($CurrentFleet = mysql_fetch_array($przylot)) {
  6. switch ($CurrentFleet["fleet_mission"]) {
  7. case 1:
  8. misja1 ( $CurrentFleet );
  9. break;
  10.  
  11. case 2:
  12. misja2( $CurrentFleet );
  13. break;
  14.  
  15. default: {
  16. doquery("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets');
  17. }
  18. }
  19. }
  20. doquery("UNLOCK TABLES", "");
  21. }



kod działa, jednak średnio raz na 2.000 przeliczeń dzieją się rzeczy typu:
case 1 misja1 ( $CurrentFleet ); wykona się dwa razy, pomnażając obytek użytkownika (czy misja 2, zależnie jaką misje wybierze uzytkownik).
Wykona się dwa razy, użytkownik dostanie dwie wiadomości o przeliczeniu ale dobytek pozostaje bez zmian.

Skrypt na testach działał wyśmienicie, jednak gdy przyszło do gry kilkuset graczy niestety już tak kolorowo nie jest. Proszę o wypowiedź kogoś doświadczonego. Skrypt działa z bazą mysql.
fr33d0m
Doświadczony ze mnie żaden, kilka ładnych lat temu grałem chwilowo w Ogame (czy cos tego typu) i administracja tej gry także, miała problem tego samego typu co Ty - rozwiązali to poprzez dodanie kolejnych warunków do spełnienia w if`ie. Myślę, że warto spróbować...
Deusx
Czyli twierdzisz, że ma sens dodanie kolejnych zabezpieczeń, nie tylko ogólne wyciąganie z bazy ?
Przykład:
Pierw rekord pobiera, następnie od razu go aktualizuje jako wykonany, następnie wykonuje określoną w "misja1" czynność
A przed pobieraniem sprawdza, czy nie został on uprzednio aktualizowany, jako wykonany ?

Myślałem o tym, jednak sądze, że błąd leży po innej stronie.
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.