Почему MySQL server has gone away ?

lutskboy
На сайте с 22.11.2013
Offline
177
261

Всем привет

Есть простой скрипт php. Код примерно такой

foreach ($requests as $request) {
        # тут ждем примерно 10 20 сек
        $response = request($request);
        if ($bad) {
                $db->query("INSERT INTO req_log (`date`, `text`, `status`) VALUES ...");
        } else {
                $db->query("INSERT INTO req_log (`date`, `text`, `status`) VALUES ...");
        }
        
}

на локалхосте Openserver работает нормально. но на впс беда MySQL server has gone away . 

в массиве  $requests у меня два значения. в первом случае ответ $bad . и тут логи в таблицу пишет. а вот потом уже нет.  MySQL server has gone away

если б скрипт долго работал то так. а то пол минуты от силы.  подскажите как решить

D
На сайте с 05.02.2022
Offline
39
#1

Оперативной памяти хватает?

Ну и логи почитайте, обычно там все ответы.

lutskboy
На сайте с 22.11.2013
Offline
177
#2
dzthd #:

Оперативной памяти хватает?

Ну и логи почитайте, обычно там все ответы.

памяти хватает. логи где смотреть?

lutskboy
На сайте с 22.11.2013
Offline
177
#3
2023-11-06 14:34:22 1672 [Warning] Aborted connection 1672 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 14:40:20 1695 [Warning] Aborted connection 1695 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 14:46:16 1698 [Warning] Aborted connection 1698 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 14:53:40 1702 [Warning] Aborted connection 1702 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 14:57:35 1706 [Warning] Aborted connection 1706 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 15:00:57 1709 [Warning] Aborted connection 1709 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 15:06:14 1713 [Warning] Aborted connection 1713 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 15:09:07 1714 [Warning] Aborted connection 1714 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)
2023-11-06 15:40:43 1749 [Warning] Aborted connection 1749 to db: 'olga_vesta' user: 'olga_vesta' host: 'localhost' (Got timeout reading communication packets)



вот такое

Aisamiery
На сайте с 12.04.2015
Offline
298
#4
Ваше подключение закрывается пока ждет. Можете поставить большее значение в настройках, но это приведет к возможной деградации системы, проще делать реконнект если соединение потеряно
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
lutskboy
На сайте с 22.11.2013
Offline
177
#5
Aisamiery #:
Ваше подключение закрывается пока ждет. Можете поставить большее значение в настройках, но это приведет к возможной деградации системы, проще делать реконнект если соединение потеряно

у меня класс для работы с бд .там есть как я понимаю проверка на соединение. если его нет. то пере подкл

        function query($query, $show_error=true, $log_query=true) {
                $time_before = $this->get_real_time();

                if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

...
if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

вот оно

D
На сайте с 28.06.2008
Offline
1104
#6
lutskboy #:

у меня класс для работы с бд .там есть как я понимаю проверка на соединение. если его нет. то пере подкл

вот оно

Соединение с базой вы открываете до начала цикла (инициируете переменную $db)

затем наступает момент 

# тут ждем примерно 10 20 сек

и вот тут вероятно соединение не дождавшись ответа закрывается по таймауту. Либо поднимайте таймаут либо открывайте и закрываете подключение в цикле

LEOnidUKG
На сайте с 25.11.2006
Offline
1745
#7
lutskboy #:
вот оно

А вы проверьте, оно точно доходить до этого условия?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
lutskboy
На сайте с 22.11.2013
Offline
177
#8
LEOnidUKG #:

А вы проверьте, оно точно доходить до этого условия?

да

lutskboy
На сайте с 22.11.2013
Offline
177
#9

если в my.cnf wait_timeout увеличить то вроде и работает. но я запускать его буду с консоли и он может работать и по 5 10мин.

так что wait_timeout ставить 300-600 не очень хотелось бы. тут либо логи в файл . либо в sqlite . либо то что написал Dram

Aisamiery
На сайте с 12.04.2015
Offline
298
#10
lutskboy #:
если в my.cnf wait_timeout увеличить то вроде и работает. но я запускать его буду с консоли и он может работать и по 5 10мин.

ну обычно всегда так демонов пишем, есть какой то код, он оборачивается в try/catch и если в try выскакивает sql исключение просто ловим его и переподключаемся, в вашем случае перед работой с бд можно выполнить запрос 'select 1' обернутый в try/catch и если подключения нет то пере подключить, я писал демонов которые месяцами работали без перезапуска, а вы 5-10 минут. PS или можно просто пинговать постоянно БД, тогда она не отключится в этом подключении )))

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий