Много потоков — много соединений к базе, как исправить?
Задача следующего плана:
Есть 100-200 клиентов в базе. Есть крон скрипт, который раз в минуту обновляет некоторые данные для всех клиентов, делает вычисления и пишет это все в базу. Сами вычисления быстрые, но необходимо одновременно всем клиентам выполнять обновление, а не по очереди. Поэтому основной скрипт запускает пачками (по 20 штук) копии другого скриптам с небольшой паузой. Отсюда у нас создается очень много соединений с базой данных, т.к. есть и другие задачи и т.д. Периодически бывает, что из-за этого падает база данных. Можно ли как-то просто решить этот вопрос, чтобы и вычисления шли все также параллельно и не было сотней подключений к базе данных?
К сожалению просто ни как. Вам нужно или переиспользовать из некого пула или использовать единый для всех.
Варианты решения:
Запускать еще один скрипт который будет собирать/отдавать данные от остальных и записывать в базу через единственный коннект.
Нормально переписать скрипт на многопоточность
Использовать брокер очереди сообщений/Rabbitmq/redis pub/sub
p.s. нормальная базу спокойно держит не одну сотню соединений. Смотрите на ресурсы, если ещё есть то просто поднимите лимиты
Понятно, про вброс данных одним скриптом думалось. Но тут нюанс, что при вычисление данных необходимо взятие данных из той же базы данных. Т.е. нам и для расчета требуется обратиться к базе и для записи потом результата.
Видимо смотреть на многопоточность в php? Это позволит нам использоваться одно соединение вместо множества?
Насчет нагрузки. Там таких вычисление много + нагрузка от пользователей. Лимиты были выставлены в 600, обычно все ок и даже не видно тормозов, но бывает, что раз в неделю-полторы все виснет.
Fixid, посмотрел на pthreads в php. В итоге я так понимаю, что это не решает проблемы? В потоках нельзя использовать одно соединение с базой и в каждом потоке необходимо создавать свой коннект?