web-dev-qa-db-fra.com

SQLSTATE [HY000]: Erreur générale: le serveur MySQL 2006 s'est arrêté après l'exécution de magon job cron

Je travaille sur le site Magento et j'obtiens cette erreur:

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

Je reçois seulement cette erreur parfois.

<?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);
  }  
}

Ce code fonctionne pendant plusieurs heures, puis il donne cette erreur. Qu'est-ce que l'erreur signifie?

9
Mahmood Rehman

Les connexions de base de données ont un délai d’expiration qui provoque cette erreur si vous essayez d’envoyer une requête après l’ouverture de la connexion. Le scénario habituel est:

  • Connexion DB ouverte
  • Récupérer des données de la base de données
  • Faire des choses, par exemple envoyer des emails (prend plus de temps que le délai de connexion à la base de données)
  • Requête DB en utilisant la même connexion
  • Erreur: le serveur MySQL est parti

Alors, quelle est la solution? Vous pouvez simplement augmenter le délai d’attente, mais c’est moche et risque de poser des problèmes lorsque le trafic sur votre site augmente. La meilleure solution serait de fermer votre connexion à la base de données, puis de la rouvrir de la manière suivante:

  • Connexion DB ouverte
  • Récupérer des données de la base de données
  • Fermer la connexion à la base de données
  • Faire des choses, par exemple envoyer des emails (prend plus de temps que le délai de connexion à la base de données)
  • Ouvrir une nouvelle connexion à la base de données
  • Requête DB en utilisant la même connexion
  • Fermer la connexion à la base de données

Voici plus d'informations: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

25
SlappyTheFish

Je n'ai pas de problèmes de délai d'attente. 

J'ai déplacé une ligne fclose (STDERR) de mon fichier principal vers un fichier inclus et cela a commencé à se produire.

SQLSTATE [HY000]: Erreur générale: le serveur MySQL 2006 est parti

J'ai remis la ligne à son emplacement d'origine et le problème est parti.

En gros, fermer STDERR à partir d'un fichier inclus semble avoir des répercussions folles.

0
Peter Smith

J'ai rencontré cette erreur auparavant. Pour mon cas, c'était parce que la taille de la base de données est trop grande, plus de 18 Go pour 5 ans 

La seule solution qui fonctionnait pour moi était de vider toutes ces données et de créer une nouvelle base de données. 

0
Fadli Saad

Si vous avez cette erreur avec l'interpréteur phpsh. Je suis capable de reproduire cette erreur avec phpsh et un nouveau shell pour doctrine manager.

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

Avec cette commande dans l'interpréteur phpsh:

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

Explication:

Cette erreur est l'erreur de délai d'attente MySQL. Soit vous avez attendu trop longtemps entre la création de votre connexion et son utilisation, ou bien vous avez commis une erreur avec l’une de vos commandes et vous avez ruiné la connexion. La solution la plus simple consiste à arrêter, à tout redémarrer et à ne pas exécuter la commande qui génère une erreur, et le faire rapidement. Ça devrait marcher.

Solution

Redémarrez votre interprète. Ne soumettez pas d'erreurs et soyez plus rapide dans l'émission de vos commandes via votre interprète.

Vous pouvez augmenter le délai d’expiration de votre connexion MySQL pour PHP. Ensuite, vous pouvez attendre plus longtemps entre la création d’une connexion, puis son utilisation.

0
Eric Leschinski

Vous pouvez également examiner la taille de la table d'index lors de l'utilisation d'un hébergement partagé. Cela peut prendre beaucoup d’espace à cause de cela et vous pouvez aussi avoir "le serveur mysql parti".

0
Jenish Patel

Si vous avez des actions qui ne fonctionnent pas avec la base de données Magento plus de 20 secondes (j'ai rencontré un hébergement partagé avec un tel wait_timeout = 20), vous devez fermer la connexion à la base de données. Magento créera une nouvelle connexion lors du prochain appel à la base de données.

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