SQLSTATE[HY000]: общая ошибка: сервер MySQL 2006 ушел на выполнение задания cron magento

Я работаю на сайте Magento, и я получаю эту ошибку:

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

Я получаю эту ошибку только иногда.

<?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 = 'myid@gmail.com';
    $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);
  }  
}

этот код работает в течение нескольких часов, затем он дает эту ошибку. Что означает ошибка?

6 ответов


соединения DB имеют тайм-аут, который вызовет эту ошибку, если вы попытаетесь отправить запрос через некоторое время после открытия соединения. Обычный сценарий:

  • открыть соединение DB
  • получить некоторые данные из DB
  • делать вещи, например, отправлять электронные письма (занимает больше времени, чем тайм-аут соединения DB)
  • запрос DB с использованием того же соединения
  • ошибка: сервер MySQL ушел

Так какое решение? Ты мог бы ... просто увеличить тайм-аут, но это некрасиво и может вызвать проблемы, когда трафик на ваш сайт увеличивается. Лучшим решением было бы закрыть соединение с БД, а затем снова открыть его следующим образом:

  • открыть соединение DB
  • получить некоторые данные из DB
  • закрыть соединение DB
  • делать вещи, например, отправлять электронные письма (занимает больше времени, чем тайм-аут соединения DB)
  • открыть новое соединение БД
  • запрос DB с использованием того же связи
  • закрыть соединение DB

здесь больше информации: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html


Если вы получили эту ошибку с переводчиком phpsh. Я могу воспроизвести эту ошибку с помощью phpsh и новой оболочки для doctrine manager.

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

С помощью этой команды в интерпретаторе phpsh:

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

объяснение:

эта ошибка является ошибкой таймаута MySQL. Либо вы слишком долго ждали между созданием соединения, а затем фактически его использовали, либо вы сделали ошибку с одной из своих команд, и вы разрушили соединение. Самое простое решение-остановить, перезапустить все и не запускать команду, которая выдает ошибку, и сделать это быстро. Это должно сработать.

решение

перезапустите интерпретатор. Не отправляйте ошибки и быстрее выдавайте свои команды через интерпретатор.

вы можете увеличить длину тайм-аута вашего соединения MySQL для PHP. Затем вы можете подождать дольше между созданием соединения, а затем использовать его.


У меня нет проблем с таймаутом.

я переместил строку fclose(STDERR) из моего основного файла в включенный файл, и это начало происходить.

SQLSTATE[HY000]: общая ошибка: сервер MySQL 2006 ушел

я переместил линию обратно в исходное место, и проблема исчезла.

в принципе, закрытие STDERR из включенного файла, похоже, имеет некоторые сумасшедшие последствия.


вы также можете посмотреть размер таблицы индекса при использовании общего хостинга. Это может занять много места из-за этого, также вы можете получить "сервер mysql ушел".


Я сталкивался с этой ошибкой раньше. Для моего случая это было связано с тем, что размер базы данных слишком велик, более 18gb для данных 5 лет.

единственное решение, которое работает для меня было сбросить все эти данные и создать новую базу данных.


Если у вас есть какие-либо действия, которые не работают с Magento DB более 20 секунд (я встретил общий хостинг с таким wait_timeout=20), вам нужно закрыть соединение с DB. Magento создаст новое соединение при следующем вызове в DB.

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