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 = '[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);
  }  
}

Этот код работает несколько часов, после чего выдает эту ошибку. Что означает ошибка?


person Mahmood Rehman    schedule 28.08.2013    source источник


Ответы (6)


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

  • Открытое соединение с БД
  • Получить некоторые данные из БД
  • Делайте вещи, например. отправлять электронные письма (занимает больше времени, чем время ожидания соединения с БД)
  • Запросить БД, используя то же соединение
  • Ошибка: сервер MySQL исчез

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

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

Вот дополнительная информация: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

person SlappyTheFish    schedule 30.08.2013

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

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

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

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

Пояснение:

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

Решение

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

Вы можете увеличить время ожидания соединения MySQL для PHP. Тогда вы сможете дольше ждать между созданием соединения и его использованием.

person Eric Leschinski    schedule 14.02.2014

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

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

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

Я вернул линию на прежнее место, и проблема исчезла.

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

person Peter Smith    schedule 06.04.2014

Вы также можете изучить размер индексной таблицы при использовании виртуального хостинга. Из-за этого это может занять много места, также вы можете получить «сервер mysql ушел».

person Jenish Patel    schedule 14.08.2014

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

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

person Fadli Saad    schedule 30.06.2015

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

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