У нас есть приложение, написанное на php с использованием mysqli, работающее на Google App Engine и подключающееся к Google Cloud SQL. У нас есть файл connection.php, который создается
$connection = new mysqli(...);
и этот сценарий включен во все сценарии, которые необходимо подключить к базе данных.
Мы получали все больше и больше трафика, и мы начали видеть проблемы с очередями запросов, очень плохо вызывающими исчезновение ошибок MySQL. Мы поняли, что проблема была в том, что мы создавали новое активное соединение для каждого входящего запроса, что было сумасшедшим. Мы понимаем, что нам нужно использовать пул соединений, но в данный момент у нас нет времени, чтобы переписать все это. Поэтому мы хотим использовать постоянное соединение php mysqli до тех пор, пока не сможем переписать приложение на Java или что-то, что может использовать пул соединений.
Теоретически, с постоянным подключением мы должны получать столько активных подключений в облачном SQL, сколько и экземпляров в App Engine (с документами, в которых говорится, что одно постоянное подключение совместно используется в одном процессе). Вот как использовать постоянное соединение:
$connection = new mysqli('p:localhost',...)
В нашем php.ini:
mysqli.allow_persistent = "1"mysqli.max_persistent = "-1"mysqli.max_links = "-1"
Однако мы видим, что каждый раз при поступлении нового запроса одно новое активное соединение все еще создается в облачном SQL. Хуже того, эти соединения не закрыты, и запросы быстрее выстраиваются в очередь. Мы видим 8 экземпляров с 40 активными подключениями за раз.
Мой вопрос: мы что-то упускаем при реализации постоянных соединений? Почему это не работает так, как мы ожидали? Заранее спасибо!
Вы должны убедиться, что ваш connection.php является Singleton. Если нет, то при каждом подключении к БД будет создаваться новое подключение mysqli с параметрами, определенными в php.ini.
Других решений пока нет …