1

Тема: PropelPDO и ошибка MySQL 2006

Здравствуйте.
Прошу помочь с решением одной проблемы.

Имеется Симфони 1.4 на которой работает сайт. Имеется папка /lib/task со скриптами, которые запускает крон. Запускает он их следующим образом (например): php symfony taskName
Скрипты обращаются к базе данных, и вот почти всегода возникает следующая ошибка:

Warning: PDO::beginTransaction(): MySQL server has gone away in D:\OpenServer\domains\saljarstod.dev\lib\vendor\symfony\lib\plugins\sfPropelPlugin\lib\vendor\propel\util\PropelPDO.php on line 128

Warning: PDO::beginTransaction(): Error reading result set's header in D:\OpenServer\domains\saljarstod.dev\lib\vendor\symfony\lib\plugins\sfPropelPlugin\lib\vendor\propel\util\PropelPDO.php on line 128
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away.

Причем ошибка возникает не в каком-то определенном месте, как мне кажется, а периодически, в разные моменты времени. может и не возникнуть вовсе. Что это может быть?

Заранее спасибо!

2 Отредактировано ta1isman (2015-12-18 11:12:48)

Re: PropelPDO и ошибка MySQL 2006

Че непонятно то, там же на чистом английским русском написано: "MySQL сервер ушел в нирвану". Наверное он у вас периодически падает или перегружен.

Форум сообщества - не место для любой политической агитации...
Хотите выражать свои политические взгляды - переименуйте его в форум Васи Пупкина,
и высказывайтесь от своего имени, а не от имени всего сообщества.
PS: это моя гражданская позиция )

3

Re: PropelPDO и ошибка MySQL 2006

Да нечему там перегружаться, там идет работа с обной таблицей. Ошибка возникает как на хостинге так и дома на локалке. Проблема только с задачами, запущеными через крон и только с этим сайтом.
Как бы выяснить поконкретнее, где именно идет затык...

4

Re: PropelPDO и ошибка MySQL 2006

zverush пишет:

Как бы выяснить поконкретнее, где именно идет затык...

Логгируйте все запросы к базе, затем прогоняйте их поочередно по многу раз и наблюдайте за результатами от сервера. Либо изучайте сами запросы на предмет наличия странной логики.
Посмотрите, с какими опциями запускается PDO, возможно там что-то интересное.

5

Re: PropelPDO и ошибка MySQL 2006

wait_timeout?

6

Re: PropelPDO и ошибка MySQL 2006

relo_san, спасибо, попробую. В принципе, я вижу в каком именно месте возникает ошибка. при сохранении сущности в базу данных. Но это же обычная операция ORM - превратить свойства в поля таблицы... То сохраняет, то нет.  Попробую изучить запросы, которые она посылает. Кстати, как увидеть нативные запросы?

shurastik, wait_timeout стандартный, равный 60. Не думаю, что стоит играться с настройками MySQL, так как на реальном сервере такой возможности нет.

7

Re: PropelPDO и ошибка MySQL 2006

zverush пишет:

Кстати, как увидеть нативные запросы?

Узнал как. Вот так:

$criteria->toString();

Вернет почти нативный запрос SQL.

8

Re: PropelPDO и ошибка MySQL 2006

zverush пишет:

shurastik, wait_timeout стандартный, равный 60. Не думаю, что стоит играться с настройками MySQL, так как на реальном сервере такой возможности нет.

стандартный, ага https://dev.mysql.com/doc/refman/5.5/en … it_timeout

9 Отредактировано zverush (2015-12-21 13:05:17)

Re: PropelPDO и ошибка MySQL 2006

shurastik, ну в общем да, не стандартный оказался default/smile В моем OpenServer изначально стоял 60.

Как бы там ни было, я кажется нашел причину ошибки. Дело таки в таймауте.
Дело в том, что скрипт запускается через CRON и его работа расчитана на несколько минут. Соединение с БД устанавливалось в самом начале. Далее, если между двумя запросами к БД проходило достаточно долго времени, то соединение рвалось. Я честно говоря не парился, потому что считал, что Propel сам возобновит соединение при его обрыве.
Теперь код выглядит так:

if (/*условие*/) {
    //сохраняем в базу данных
    $dbrow->save();
} else {
    //поддерживаем соединение
    $this->ping_database(); //этот метод просто получает произвольный объект из бд
}

Вроде работает... default/smile
если знаете лучший способ поддерживать соединение с БД, пожалуйста скажите, буду признателен.
Спасибо!

10

Re: PropelPDO и ошибка MySQL 2006

ну если настройки не хочется трогать, то поставить для сессии сколько нужно перед началом работы

SET wait_timeout=3600

11

Re: PropelPDO и ошибка MySQL 2006

Кстати, вопрос из той же оперы.
Как через Propel переустановить утерянное соединение с базой данных?

В начале скрипта у меня используется следующий код:

$databaseManager = new sfDatabaseManager($this->configuration);
$connection = $databaseManager->getDatabase($options['connection'])->getConnection();

Если таймаут превышен, то есть соединение с БД теряется, я пробую вновь установить соединение через эти две строчки кода, но в этот раз ничего не выходит. Соединение по прежнему оборвано.
Как переустановить соединение? Спасибо!

12

Re: PropelPDO и ошибка MySQL 2006

Короче, решил проблему комбинированием SET wait_timeout и периодическим пингом к базе.

$sql = "SET wait_timeout=18000;";
$con = Propel::getConnection(CrmCompanyPeer::DATABASE_NAME, Propel::CONNECTION_READ);
$st = $con->prepare($sql);
$st->execute();

Периодически посылаю такой пинг (между критическими, долговыполняющимися функциями):

$sql = "SHOW TABLES;"; //Произвольно. Может быть любой другой запрос к бд.
$con = Propel::getConnection(CrmCompanyPeer::DATABASE_NAME, Propel::CONNECTION_READ);
$st = $con->prepare($sql);
$st->execute();