Постоянное подключение к базе данных в PHP

У меня есть некоторые сомнения по поводу постоянных подключений к базе данных в PHP.

Я понимаю, что использование постоянного соединения может быть эффективным, потому что каждый процесс PHP, которому требуется соединение с одним и тем же хостом/пользователем, может совместно использовать это соединение без необходимости его повторного установления.

Я понимаю, что в новейшей реализации представлены функции, которые преодолевают проблему неизвестного состояния соединения.

Но! Если у меня есть 10 тысяч процессов, использующих одно и то же соединение, это снизит производительность моего приложения, потому что они могут использовать соединение только по одному! Это правда или я ошибаюсь?


person MaCi    schedule 19.07.2012    source источник
comment
А какая у вас будет производительность, если она создаст 10 тысяч непостоянных соединений!!   -  person Rikesh    schedule 19.07.2012
comment
для 10k подключений я бы использовал кластер mysql с балансировкой нагрузки   -  person MilMike    schedule 19.07.2012
comment
вы имеете в виду 10k уникальных запросов, запросы, которые были отправлены ранее, могут быть кэшированы, если результат не изменился, поэтому он быстрее вернет результат и перейдет к следующему запросу   -  person Gntem    schedule 19.07.2012


Ответы (2)


Использование постоянных соединений будет быстрее примерно в любом случае, поскольку вы сэкономите накладные расходы на установление соединения.

Использование постоянных подключений не ограничивает вас одним подключением, вы можете иметь пул соединений из 100 или 1000 постоянных подключений.

Обработка 10 000 параллельных запросов также потребует некоторой балансировки нагрузки и кластера базы данных, однако одна база данных будет перегружена как непостоянными, так и постоянными подключениями, если вы попытаетесь протолкнуть через нее 10 000 запросов одновременно.

person bardiir    schedule 19.07.2012

Преимущество в эффективности, обеспечиваемое постоянными соединениями, особенно при установлении соединения, будет огромным, если у вас действительно есть 10 000 процессов, запрашивающих базу данных.

Предполагая, что вы используете PHP под Apache, при первом установлении SQL-соединения «дочерний процесс» Apache будет держать его открытым (т.е. - постоянное соединение). Все запросы PHP, которые принадлежат этому конкретному «дочернему процессу Apache», будут повторно использовать это соединение, если, конечно, информация о соединении одинакова. Конфигурация Apache определяет, сколько запросов может обработать один дочерний процесс, прежде чем он будет перезапущен, что должно очистить постоянное соединение.

Теперь есть также случай, когда вы выполняете запросы в цикле или даже, осмелюсь сказать, в бесконечном цикле. В этом случае даже непостоянное соединение будет смертельно опасным.

Сомнительно, что количество процессов, использующих ваши постоянные соединения, будет фактором эффективности сервера (если, как я уже упоминал, у вас нет неэффективного кода, использующего запросы). На чем следует сосредоточиться, так это на том, сколько постоянных подключений вы должны разрешить и сколько может обрабатывать ваша база данных/сервер?

Руководство MySQL для постоянных соединений, http://php.net/manual/en/features.persistent-connections.php, также охватывает большую часть (и даже больше) того, что я только что резюмировал.

person newfurniturey    schedule 19.07.2012