it-swarm.com.de

SQLSTATE [HY000]: Allgemeiner Fehler: 2006 Der MySQL-Server ist nicht mehr mit dem Cron-Job Magento ausgeführt worden

Ich arbeite an der Magento-Site und erhalte folgende Fehlermeldung:

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

Ich bekomme diesen Fehler manchmal nur.

<?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 mehrere Stunden und gibt dann diesen Fehler aus. Was bedeutet der Fehler?

9
Mahmood Rehman

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:

  • DB-Verbindung öffnen
  • Holen Sie einige Daten aus der DB
  • Tun Sie Sachen, z. E-Mails senden (dauert länger als DB-Timeout)
  • Abfrage-DB mit derselben Verbindung
  • Fehler: MySQL-Server ist weg

Also, was ist die Lösung? Sie können das Timeout einfach erhöhen, aber das ist hässlich und kann Probleme verursachen, wenn der Verkehr zu Ihrer Site zunimmt. Die beste Lösung wäre, Ihre DB-Verbindung zu schließen und sie dann wie folgt erneut zu öffnen:

  • DB-Verbindung öffnen
  • Holen Sie einige Daten aus der DB
  • Schließen Sie die DB-Verbindung
  • Tun Sie Sachen, z. E-Mails senden (dauert länger als DB-Timeout)
  • Neue DB-Verbindung öffnen
  • Abfrage-DB mit derselben Verbindung
  • Schließen Sie die DB-Verbindung

Hier finden Sie weitere Informationen: http://dev.mysql.com/doc/refman/5.0/de/gone-away.html

25
SlappyTheFish

Ich habe keine Probleme mit dem Timeout. 

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

SQLSTATE [HY000]: Allgemeiner Fehler: 2006 MySQL-Server ist nicht mehr vorhanden

Ich verlegte die Linie wieder an ihren ursprünglichen Platz und das Problem verschwand.

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

0
Peter Smith

Ich habe diesen Fehler schon einmal gesehen. In meinem Fall lag es daran, dass die Datenbankgröße zu groß war, mehr als 18 GB für 5 Jahre. 

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

0
Fadli Saad

Wenn Sie diesen Fehler mit dem PHP-Interpreter erhalten haben. Ich bin in der Lage, diesen Fehler mit phpsh und einer neuen Shell zum Doktrinmanager zu reproduzieren.

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

Mit diesem Befehl im PHP-Interpreter:

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

Erklärung:

Dieser Fehler ist der MySQL-Timeout-Fehler. Entweder haben Sie zu lange gewartet, bis Sie Ihre Verbindung erstellt haben und dann tatsächlich verwendet haben, oder Sie haben mit einem Ihrer Befehle einen Fehler gemacht und Sie haben die Verbindung ruiniert. Die einfachste Lösung ist, zu stoppen, alles neu zu starten und den Befehl, der einen Fehler auslöst, nicht auszuführen und dies schnell zu tun. Es sollte funktionieren.

Lösung

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

Sie können die Timeout-Länge Ihrer MySQL-Verbindung für PHP erhöhen. Sie können dann länger warten, bis Sie eine Verbindung herstellen und dann verwenden.

0
Eric Leschinski

Bei Verwendung von Shared Hosting können Sie auch die Größe der Indextabelle überprüfen. Es kann daher viel Platz beanspruchen, da Sie auch den "MySQL-Server verschwinden lassen" können.

0
Jenish Patel

Wenn Sie über Aktionen verfügen, die nicht länger als 20 Sekunden mit Magento DB zusammenarbeiten (ich habe Shared Hosting mit soem wait_timeout = 20 getroffen), müssen Sie die DB-Verbindung schließen. Magento erstellt beim nächsten Aufruf der DB eine neue Verbindung.

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