пятница, 3 августа 2018 г.

Реконнект mysql-соединения

Иногда, если ваш скрипт долго получает данные из других источников (парсит чужие сайты, например, или запрашивает медленно думающее API), запись в БД может оборваться с известным сообщением Mysql server has gone away.

Но, скажете вы, я поставил set_time_limit в 7200 секунд. Этого недостаточно. Помимо лимита на время исполнения скрипта, указываемого в php.ini или конкретно для скрипта, существует еще wait_timeout, настроенный в конфиге mysql. Как только данный таймаут истекает, mysql-сервер перестает обращать внимание на ваш скрипт, вследствие чего вы получаете типичную ошибку Mysql server has gone away.

Естественно, если у вас есть доступ к конфигурации mysql, то можно подредактировать wait_timeout. Но если, например, доступ к БД вам запретили ДБА, или скрипт работает раз в полгода, или в целом не хочется лезть в кишки mysql, то можно воспользоваться простейшим подходом - разрывать и восстанавливать соединение заново. Также никто не запрещает вам запускать скрипт через крон, например, и обрабатывать данные частями.

Для примера приведу код как разрывать-восстанавливать соединение с БД в битриксе:

// Старое ядро, $GLOBALS['DB'] аналог $DB
$dbHost = $GLOBALS['DB']->DBHost;
$dbName = $GLOBALS['DB']->DBName;
$dbLogin = $GLOBALS['DB']->DBLogin;
$dbPassword = $GLOBALS['DB']->DBPassword;

$GLOBALS['DB']->Disconnect();
$GLOBALS['DB']->Connect($dbHost, $dbName, $dbLogin, $dbPassword);

// Новое ядро
$cn = \Bitrix\Main\Application::getConnection();
$cn->disconnect();
$cn->connect();

Комментариев нет:

Отправить комментарий