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:
$przylot = doquery("SELECT * FROM {{table}} WHERE `fleet_end_time` <= '".time()."' AND `fleet_mess` > '0' ORDER BY `fleet_end_time` ASC ", 'fleets'); if($przylot) { 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", ""); switch ($CurrentFleet["fleet_mission"]) { case 1: misja1 ( $CurrentFleet ); break; case 2: misja2( $CurrentFleet ); break; default: { doquery("DELETE FROM {{table}} WHERE `fleet_id` = '". $CurrentFleet['fleet_id'] ."';", 'fleets'); } } } doquery("UNLOCK TABLES", ""); }
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.