• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Error 2006: Server has gone away

Status
Für weitere Antworten geschlossen.

Frank

Neues Mitglied
Hi leute

Ich habe auf meinem RootServer ein PHP Programm laufen, welches eine Art Plugin für ein Spiel darstellt.

Das Problem liegt nun darin, dass nach etwa 9-10 Stunden das ganze abstürzt und ich im Log folgenden Fehler finde
Code:
28.04.2008 - 05:02:23 :: WARNING	Could not get ranklist from records table
28.04.2008 - 05:02:24 :: ERROR  	[2006] MySQL server has gone away

Habt ihr eine Idee woran das liegen kann? Der MySQL Server ist laut seinem Log nicht abgestürzt. Liegt es daran dass ich die Verbindung nicht solange aufrecht erhalten darf?
 
Werbung:
hm danke.

Hätte nicht damit gerechnet, zwischen 2 Abfragen vergehen maximal exakt 4 minuten 15 sekunden. Dann zählt wohl nicht die zeit zwischen den abfragen sondern zwischen Verbingun auf/zu.

Gibt es einen Weg eine dauerhafte verbindung zu bekommen?
Naja werd mal danach Googlen, vlt find ich ja was, ansonsten bin ich auch für alle Tipps offen.

//Edit
Nach Voreinstellung schließt der Server die Verbindung, wenn nichts geschieht, nach acht Stunden.
Ok jetzt bin ich verwirrt, es passiert doch alle 4 minuten 15 sekunden was (mindestens, meistens sogar öfter)
Dieses Zeitlimit können Sie in der Variablen wait_timeout ändern, wenn Sie mysqld starten. Siehe Abschnitt 5.2.2, „Server-Systemvariablen“.
Hmpf, kann leider nicht davon ausgehen, dass ich hier zugriff drauf habe, außerdem müsste ich das auf "Unendlich" stellen.
 
Werbung:
Wenn eine Abfrage so lange dauert solltest du dir das Datenbankmodell nochmal anschauen. Auch wenn es nicht für die Öffentlichkeit sein sollte sollte es doch etwas performant laufen.
 
ne das hast du falsch verstanden, das datenbank modell ist ganz richtig so.
Die Abfrage dauert auch nur 1ms oder so (ganz normales select mit 2 spalten (id, int), Limit 30). Das Programm selbst läuft in einer Endlosschleife und macht diese abfrage alle mindestens 4-5min
 
Achsoo, und das Programm beendet dann die MySQL-Verbindung nicht nach jedem Statement? Wie wärs wenn du das Programm selbst alle 4 Minuten aufrufen lässt statt es ständig laufen zu lassen?!
 
Werbung:
schlecht, weil es von nem server über xml-rpc callbacks bekommt und darauf reagieren muss, zu jeder zeit, das mit den 4 min 15 sec ist nur wenn "nix" passiert.

Die Verbindung bleibt offen (wird nur am anfang des scripts einmal aufgebaut)
 
Dann setz doch z.B. alle 4 min ein Statement ab, welches nichts weiter macht - nur um die Verbindung offen zu halten. Z.B.

Code:
select now()
 
das ist doch schon so...

Also nochmal strukturiert von vorne

Das Programm läuft in einer Endlosschleife.
Innerhalb der Schleife wird auf einen Callback gewartet.
Kommt ein Callback an, so wird es verarbeitet.
Kommt kein Callback an, so wird nach 4 Minuten das warten abgebrochen,
ein statement abgesetzt
PHP:
<?php
public function gettop5($mapid) {
    if(!($result = mysql_query("SELECT `time`,`nick` FROM `tmuf_records` WHERE `map` = '".$mapid."' ORDER BY `time` ASC LIMIT 5"))) {
      $this->log->log("WARNING","Could not get ranklist from records table");
      $this->log->log("ERROR","[".mysql_errno()."] ".mysql_error());
      trigger_error("Could not get position from records table",E_USER_ERROR);
    }
    $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><manialink id=\"3\"><type>default</type><frame posn=\"15 -25 0\">";
    $i = 1;
    $posy = 5;
    $xml .= "<quad style=\"BgsPlayerCard\" substyle=\"BgPlayerCard\" sizen=\"48 3\" posn=\"0 -{$posy}\"/>";
    $xml .= "<label posn=\"5 -".$posy.".5\" textsize=\"2\">\$0f0Lokale Bestenliste</label>";
    $posy += 3;
    while($row = mysql_fetch_assoc($result)) {
      $row["nick"] = str_replace(array("<",">"),array("&lt;","&gt;"),$row["nick"]);
      $xml .= "<quad style=\"BgsPlayerCard\" substyle=\"BgPlayerCard\" sizen=\"48 3\" posn=\"0 -{$posy}\"/>";
      $xml .= "<label posn=\"5 -".$posy.".5\" textsize=\"2\">{$i}. (\$fff".$this->_formattime($row["time"])."\$g) {$row["nick"]}\$z</label>";
      $i += 1;
      $posy += 3;
    }
    if ($i == 1) {
      $xml .= "<quad style=\"BgsPlayerCard\" substyle=\"BgPlayerCard\" sizen=\"48 3\" posn=\"0 -{$posy}\"/>";
      $xml .= "<label textsize=\"2\" posn=\"5 -8.5\">Keine lokalen Rekorde verfügbar</label>";
    }
    $xml .= "</frame></manialink><custom_ui><checkpoint_list visible=\"false\"/></custom_ui>";
    return $xml;
  }
?>
und die Schleife fängt wieder an (wartet wieder max 4 minuten)
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben