MUTOgen4eg
@MUTOgen4eg

Как предотвратить Mysql server has gone away?

Столкнулся со странной проблемой при мало-мальски длительных крон задачах.
Каждый раз задача заканчивается ошибкой Mysql server has gone away при очередной операции обращения к базе.
Я сделал проверочный скрипт, чтобы исключить все программные проблемы кода. Оставил только чистый PDO + 2 SELECT'а из базы с паузой 20 сек.
Ошибка все та же. Причем в конфиге mysql стоит таймаут 100 минут, число количество конкурентных сесий - 1000, а размер одного пакета - 256 Мб.
В php.ini стоит mysql.connect_timeout и default_socket_timeout = 600

Из-за чего такое может возникать?
  • Вопрос задан
  • 543 просмотра
Пригласить эксперта
Ответы на вопрос 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
В общем с PDO история такая, что сама пул соединений управляется как на стороне драйвера, так и на стороне MySQL. Если соединение не используется, то оно будет закрыто.

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// соединение установлено

// делаем какую-то работу

// закрываем соединение
$dbh = null;


По-хорошему вам нужно изолировать выполнением вашего запроса в отдельную функцию и вызывать ее через определенные интервалы.

function doit() {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// соединение установлено
// делаем какую-то работу
// закрываем соединение
$dbh = null;
}
// а затем вызывать вот так
doit();
sleep(60);
doit();


Также рекомендуется проверить значение wait_timeout в настройках MySQL.

Еще, как вариант, можно сделать нечто вроде этого https://terenceyim.wordpress.com/2009/01/09/adding...
Дело в том, что у PDO нет полноценного ping, поэтому приходится симулировать его пустым запросом и отловом исключения с восстановлением соединения в дальнейшем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы