Hallo,
letzte Woche hat mein Hoster einen Parameter bei seinem mysqld gesetzt, der den Server vor Überlastung schützt.
Das Ergebnis war, das meine vms-seite massiv Fehler brachte. Keine Fehlermeldungen an sich, sondern die User meldeten, das diverse Funktionen nicht mehr richtig liefen. z.B. wurden Banner nicht mehr vergütet, Einsätze und Gewinne bei Spielen nicht gebucht.
phpmyadmin brachte:
#1226 - User 'dbuser6550' has exceeded the 'max_questions' resource (current value: 18000)
Bedeutet, das das Limit von 18k db-zugriffen pro Stunde aufgebraucht war.
Mein Hoster hat nun das Limit kurzzeitig auf 36k gesetzt, damit ich Zeit habe, das Script zu optimieren. Aber selbst das hat nicht gereicht.
Ich habe mir schnell was eingebaut, was die db-abfragen mal mitlogt und habe das dann ausgewertet. In der Woche, wo ja weniger als am Wochenende los ist, hatte ich so schon über 40k Zugriffe in der Stunde. Dabei wurden 100% noch nicht alle Anfragen aufgezeichnet, weil viele Games z.B. nicht über die functions.lib gehen und selbst auf die DB zugreifen.
Besonders schlimm war, das bei Aus- und Einzahlungen erst die Schnittstelle bedient wird und dann der Ab-/Zugang auf dem Konto im VMS gebucht wird. War dann so, das der User sein Guthaben über die Schnittstelle ausgezahlt bekommt, das dann aber nicht im VMS registriert wird.
Ein User hat das dann auch schnell spitz bekommen und ausgenutzt. Zum Glück hat ein User, der ebenfalls eine VMS-Seite betreibt, zufällig zu diesem Zeitpunkt abgebucht, den Fehler bemerkt und mich informiert. Nicht auszudenken, was sonst noch passiert wäre ...
Die letzten Tage habe ich nun optimiert was das Zeug hält und komme in aktiven Zeiten auf 17K in der Stunde. Das reicht immernoch nicht, weil mir die zu 18K einfach zu knapp ist.
Das Script ist in Bezug auf DB-Zugriffe einfach erschreckend. SELECT-Anweisungen werden nur selten mit JOIN oder WHERE zusammengefasst. klick4.php, die hier oft schon angesprochen wurde, ist ein Graus. Ich habe da nun nur noch 2 Anweisungen ... eine, was im reload ist, eine was nicht im reload ist. Spart so schon Tausende von Zugriffen ein und gibt sogar mehr Info aus als vorher.
Ich werde nun nicht alles verraten, was ich mir in den letzten Tagen mühevoll erarbeitet habe. Seit einer Woche bin ich nun dabei und es ist noch nicht erledigt.
SQL ist wesentlich mehr als INSERT, SELECT, UPDATE, DELETE.
Was wichtig wäre: wie kann man nun DB-Anfragen die nicht ausgeführt werden, wiederholen? Setzt voraus, das man eine DB-Anfrage nicht nur einfach so ausführt sondern auch den Rückgabewert auswertet. DB-Anfragen müssten vorher festgehalten werden und die Ausführung überprüft werden.
Macht die Augen nicht zu bei diesem Problem, evtl. setzt euer Hoster auch gerade diesen Wert und auch bei euch geht nichts mehr
Ich hoffe, dass das neue VMS besser wird in Sachen DB-Abfragen. Seit mysql 4.0 gibts den Parameter MAX_QUESTIONS und immer mehr Hoster werden diesen Wert setzen.