Здесь есть две проблемы; одно усугубляет другое.
@ zombat определил большую проблему: вам не нужно подключаться и отключаться для каждого запроса. Хотя MySQL имеет быстрый цикл установки и демонтажа, он тратит впустую другие ресурсы. Более разумно открыть соединение один раз на этапе настройки кода, а затем повторно использовать соединение для каждого запроса, пока не закончится страница. Я бы предложил использовать переменную экземпляра для объекта mysqli.
(Если у вас есть структура, в которой есть несколько баз данных, и какая из них зависит от объекта, вам нужно усовершенствовать обработчик базы данных, чтобы отслеживать, какие соединения с базой данных у него открыты, чтобы он открывал только те, которые ему нужны. Но это гораздо более сложная тема, которая большинству людей не понадобится.)
Здесь «другие ресурсы» - это соединения MySQL. Если mysqli создает постоянные соединения, он фактически не будет закрывать соединение с MySQL (на самом деле он должен также повторно использовать соединения, чтобы у вас даже не возникало этой проблемы, но я отступаю). Значение MySQL по умолчанию для тайм-аута таких соединений составляет несколько часов, так что вы, вероятно, достигаете этого предела. Если вы видите сотни «спящих» потоков в SHOW PROCESSLIST
, то это то, что происходит. Параметр для изменения wait_timeout
. И max_connections
тоже может быть слишком низким.
Но я рекомендую сначала починить обработчик базы данных.