Иногда, если ваш скрипт долго получает данные из других источников (парсит чужие сайты, например, или запрашивает медленно думающее API), запись в БД может оборваться с известным сообщением Mysql server has gone away.
Но, скажете вы, я поставил
Естественно, если у вас есть доступ к конфигурации mysql, то можно подредактировать
Для примера приведу код как разрывать-восстанавливать соединение с БД в битриксе:
Но, скажете вы, я поставил
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();