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();