Скрипт теряет соединение с MySQL

ONK

Пассивист PHPСluba
Скрипт теряет соединение с MySQL

Проблема, скрипт в процессе длительной работы теряет соединение с MySQL сервером.

Скрипт может проработать как 30 минут так и 30 часов, но рано или поздно падает при попытке исполнения очередного SQL запроса с сообщением Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Средняя интенсивность исполнения SQL запросов от 1 в 10 секунд до 50 в секунду. Потеря соединения происходит при слабой активности скрипта, но статистика пока ещё не набрана.

Ктонибудь с подобным сталкивался?
Есть идеи?

PHP 4.4.7 CGI
MySQL 4.1.22
FreeBSD 6.2

Мне ничего умнее чем попытаться восстановить коннект и исполнить запрос повторно, в голову не приходит.
 

ONK

Пассивист PHPСluba
В zf что-то особенное на эту тему есть?
Как обработать это исключение я в принципе и так представляю себе, меня интересует не упустил ли я чего из виду, может здесь есть какая-то элементарная причина, которую надо просто устранить.
 

ONK

Пассивист PHPСluba
Krishna show variables показывает, что
wait_timeout 28800
как и
interactive_timeout 28800

Вопервых это 8 дней, а во вторых, максимальный перерыв между SQL запросами у меня 15 секунд, так что вре не активности соединения не может вырасти более чем до 15 секунд.
Да и обрыв соединения происходит уж совсем непредсказуемо, то 30 минут, то 1,5 суток.

Так что похоже это тут не причём, но спасибо за идею, покопаюсь в мане по поводу конфигурационных переменных.
 

ONK

Пассивист PHPСluba
Krishna, ничего подозрительного.

Повторяется типичная запись старта/остановки сервера

Код:
061207 17:56:30  mysqld started
/usr/local/libexec/mysqld: ready for connections.
Version: '4.1.22'  socket: '/tmp/mysql.sock'  port: 3306  FreeBSD port: mysql-server-4.1.22
061207 19:15:23 [Note] /usr/local/libexec/mysqld: Normal shutdown

061207 19:15:23 [Note] /usr/local/libexec/mysqld: Shutdown complete

061207 19:15:23  mysqld ended
 

ustas

Элекомист №1
ONK
>В zf что-то особенное на эту тему есть?
в zf перед запросом вызывают $this->_connect();
 

ONK

Пассивист PHPСluba
ustas, это не эффективное решение, мне не нравится. Гораздо логичнее пытаться устранить проблему при её возникновении, т.е. прозрачно (для прикладного кода) обработать ошибку выполнения SQL запроса, с однократным реконнектом и попыткой повторного исполнения запроса.
 

ustas

Элекомист №1
ONK
тогда устранять нужно не средствами php, а хорошим админом
 

ONK

Пассивист PHPСluba
Mr_Max в чём смысл давать ссылки на C API, в ПХП нет прямых врапперов к этим функциям, а свой экстеншен я писать не собираюсь.

Я остановился на обработке ошибки выполнения SQL запроса. Через недельку будет ясно на сколько помогло.

-~{}~ 26.10.07 13:12:

Mr_Max, по поводу второй ссылке, там какраз описано поведение клиентской ПХП библиотеки. К сожалению автореконнект с её помощью заканчивается сообщением Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
 

ys

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

В документации нашел такое:

MYSQL_OPT_RECONNECT (argument type: my_bool *)
Enable or disable automatic reconnection to the server if the connection is found to have been lost. Reconnect has been off by default since MySQL 5.0.3; this option is new

Так. Стоп, у тебя четверка, следовательно, должно работать и так.

-~{}~ 26.10.07 17:06:

А если увеличить значение в php.ini или другим способом выставить:
mysql.connect_timeout
 

cDLEON

Онанист РНРСlub
У меня была похожая проблема...
Решал обычным селектом на какую-нить таблицу.
 

ys

отодвинутый новичок
Для петерки я немного правил ext/mysql/php_mysql.c
Вставив перед mysql_real_connect():

#if MYSQL_VERSION_ID >= 50013
{
my_bool my_bool_true = 1;
mysql_options(&mysql->conn, MYSQL_OPT_RECONNECT, &my_bool_true);
}
#endif

Экий ugly hack, зато работают "долгие" cli php скрипты.
 
Сверху