Уже долго бьюсь над этой проблемой и никак не получается решить. Есть около 100 параллельно работающих парсеров, каждый парсер работает где-то минут 20 при этом он с некоторой периодичностью подключается к базе, чтобы занести туда инфу. Так как 'max_user_connections' на сервере установлено - 10, надо постоянно подключаться и отключаться от базы, тоесть как-то регулировать можно ли скрипту соединяться с базой или ждать пока это соединение освободится. Так вот как узнать сколько уже есть соединений с базой? Или какой другой способ, чтобы не было превышения max_user_connections?
У меня и есть VPS. Проблема в том что одновременных подключений может быть и 100 и 1000, а это критично для базы
костыль: делаем текстовый файлик. перед подключением и после завершения занесения данных - пытаемся заблокировать файлик монопольно. если блок есть - открываем файлик и читаем из него число. если мы завершаемся - декремент значения, запись, снятие блокоровки. если мы пытаемся подключиться - сравниваем число с лимитом. если "можно" - инкремент числа, запись, снятие блокировки. если "нельзя" то уж сами думайте что будет парсер делать пока ему нельзя сбросить данные. конец костыля. а еще при подключении получать код ошибки. если это 1040 или 1203 значит превышен общий лимит сервера или юзера соответственно. что с этим делать - решайте сами.
Делал так: Код (Text): Connect $pid=file_get_contents(dirname(__FILE__)."/base_status"); if ($pid=='0' or (!empty($pid) and posix_kill($pid,0)==false)) { file_put_contents(dirname(__FILE__)."/base_status",getmypid()); $base=mysql_connect(HOST_NAME, DB_USER_NAME, PASSWORD); } Close if (mysql_close($base)==true) { file_put_contents(dirname(__FILE__)."/base_status","0"); } Но все-равно через какое-то время идет превышение max_user_connections, возможно в какой-то момент идет одновременное чтение base_status (а там 0). С блоком может быть такая же штука, или может я не правильно понял этот вариант? Можно кусок кода в пример? я не знаю как определить сколько максимально подключений может быть к базе, поэтому боюсь что база ляжет
Выше Вам сказали - обрабатывайте ошибку при подключении. Движок SQL очень быстро отрабатывает такое и малозатратно, так что Вам вряд ли удастся положить базу (конечно, если Вы не будете делать десятки-сотни тысяч подключений в секунду / сервер ). А дальше всё просто/стандартно - отловили ошибку и ждёте N секунд для следующей попытки. Если и в следующий раз не пускает, то (=N*K) и т.д., пока не "вклинится". Остальное - по желанию/необходимости.
лимит по конектам в 10 это чушь. Ваш вопрос о том как равести костёр не наколов дров или как быть сытым без еды. Даже лимит конектов в 30 это ничтожно мало и выставляется в основом на площадках виртуального хостинга. А для чего лимит в 10 конектов на VDS не представляю. Для работы пары клиентов СУБД хватило бы, а вы там воркеров гоняете. Если вы полагаете что СУБД "ложится" от количества подключений, - удивлю, но это не так. Сами по себе подключения генерируют минимальную нагрузку которая не сравнима с активностью подключений, то есть с выполнением операций по их запросам, которые просто встают в очередь.
Поспорю - открытие коннекта стоит довольно дорого. В своем масштабе. Но не настолько, чтобы "много коннектов могут положить базу". Не могут. База для того и база, чтобы к ней коннектились и слали запросы. Это ее буквальное предазначение. Чтобы описать масштабы дороговизны открытия коннектов, то это как 1 копейка и 5 копеек. 5 копеек в 5 раз дороже одной и, несомненно весома. Но не при покупке мерседеса. Поддержу - 10 коннектов это смешно. У вас VDS поднят на телефоне чтоль, которому лет 10?