2013-08-28 9 views
9

ich auf Magento Website arbeite und ich bekomme diese Fehlermeldung:SQLSTATE [HY000]: Allgemeiner Fehler: 2006 MySQL-Server entfernt magento auf Lauf Cron-Job gegangen

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away on running 
cron job magento 

ich nur manchmal diesen Fehler.

<?php 
class Namespace_Module_Model_Observer 
{ 
    public function importemails(Varien_Event_Observer $observer) 
    { 
    echo "Hi Dear";exit(); 

    /* connect to gmail */ 
    $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
    $username = '[email protected]'; 
    $password = 'mypass'; 

    /* try to connect */ 
    $inbox = imap_open($hostname,$username,$password) 
     or die('Cannot connect to Gmail: ' . imap_last_error()); 

    /* grab emails */ 
    $emails = imap_search($inbox,'ALL'); 

    /* if emails are returned, cycle through each... */ 
    if($emails) { 

     /* begin output var */ 
     $output = ''; 

     /* put the newest emails on top */ 
     rsort($emails); 

     /* for every email... */ 
     foreach($emails as $email_number) { 

     /* get information specific to this email */ 
     $overview = imap_fetch_overview($inbox,$email_number,0); 
     $message = imap_fetchbody($inbox,$email_number,2); 

     /* output the email header information */ 
     $output.= 
      '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; 
     $output.= '<span class="subject">'.$overview[0]->subject.'</span> '; 
     $output.= '<span class="from">'.$overview[0]->from.'</span>'; 
     $output.= '<span class="date">on '.$overview[0]->date.'</span>'; 
     $output.= '</div>'; 

     /* output the email body */ 
     $output.= '<div class="body">'.$message.'</div>'; 
     } 
     echo $output; 
    } 

    /* close the connection */ 
    imap_close($inbox); 
    } 
} 

Dieser Code funktioniert für mehrere Stunden, dann gibt es diesen Fehler. Was bedeutet der Fehler?

Antwort

25

DB-Verbindungen haben eine Zeitüberschreitung, die diesen Fehler verursacht, wenn Sie versuchen, eine Abfrage nach dem Öffnen der Verbindung zu senden. Das übliche Szenario ist:

  • öffnen DB-Verbindung
  • Fetch einige Daten von DB
  • Sachen machen, zum Beispiel Bitte senden Sie E-Mails (dauert länger als DB-Verbindung Timeout)
  • Abfrage DB mit derselben Verbindung
  • Fehler: MySQL-Server

So weggegangen ist - was ist die Lösung? Sie könnten das Zeitlimit einfach erhöhen, aber das ist hässlich und könnte Probleme verursachen, wenn der Traffic auf Ihrer Site steigt. Die beste Lösung wäre, um Ihre DB-Verbindung zu schließen und dann wieder öffnen wie folgt aus:

  • öffnen DB-Verbindung
  • Fetch einige Daten aus DB
  • Schließen DB-Verbindung
  • Sachen machen, zum Beispiel Bitte senden Sie E-Mails (dauert länger als DB-Verbindung Timeout)
  • öffnen neue DB-Verbindung
  • Abfrage DB gleiche Verbindung mit
  • Schließen DB-Verbindung

hier weitere Informationen: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

0

Wenn Du hast diesen Fehler mit dem PHPsh Interpreter bekommen. Ich bin in der Lage, diesen Fehler mit Phpsh und eine neue Shell zu Doktrin-Manager zu reproduzieren.

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 

Mit diesem Befehl im phpsh Interpreter:

php> $result = $conn->query('select psetid from psetproblems')->fetchAll(); 

Erläuterung:

Dieser Fehler ist die MySQL-Timeout-Fehler. Entweder hast du zwischen dem Erstellen deiner Verbindung und dem anschließenden Benutzen zu lange gewartet oder du hast mit einem deiner Befehle einen Fehler gemacht und die Verbindung ruiniert. Die einfachste Lösung besteht darin, alles zu stoppen, neu zu starten und den Befehl, der einen Fehler verursacht, nicht schnell auszuführen. Es sollte funktionieren.

Lösung

Ihren Interpreter neu starten.Übermitteln Sie keine Fehler und geben Sie Ihre Befehle schneller über Ihren Interpreter ab.

Sie könnten die Timeout-Länge Ihrer MySQL-Verbindung für PHP erhöhen. Dann können Sie länger warten zwischen dem Erstellen einer Verbindung und dann verwenden Sie es.

0

Ich habe keine Timeout-Probleme.

Ich habe eine fclose (STDERR) -Zeile aus meiner Hauptdatei in eine eingeschlossene Datei verschoben und dies begann.

SQLSTATE [HY000]: Allgemeiner Fehler: 2006 MySQL-Server entfernt

gegangen

ich die Linie wieder an ihren ursprünglichen Platz bewegt und Problem ging weg.

Grundsätzlich scheint das Schließen von STDERR aus einer enthaltenen Datei einige verrückte Auswirkungen zu haben.

0

Sie können auch die Größe der Indextabelle überprüfen, wenn Sie Shared Hosting verwenden. Es kann viel Platz brauchen, weil Sie auch "mysql server gone away" bekommen können.

0

Ich habe diesen Fehler vor aufgetreten. Für meinen Fall war es wegen der Datenbankgröße zu groß, mehr als 18 GB für 5 Jahre Daten.

Die einzige Lösung, die für mich funktioniert, war, alle diese Daten zu löschen und eine neue Datenbank zu erstellen.

0

Wenn Sie irgendwelche Aktionen haben, die nicht länger als 20 Sekunden mit Magento-DB arbeiten (ich traf Shared Hosting mit solchen wait_timeout = 20), müssen Sie die DB-Verbindung schließen. Magento wird beim nächsten Aufruf der DB eine neue Verbindung erstellen.

Mage::getSingleton('core/resource')->getConnection('read')->closeConnection();