Постоянные соединения с БД (PHP). Как это работает?

PHP, запускаясь и отрабатывая, "умирает". Такова его механика работы. И во многом это, прям , круто. Безопасно. Однако тут вопрос. Как это все работает с соединением с БД? Если на сайте хайлоад, то каждый новый запрос из браузера будет делать новое соединение с БД (ведь все скрипты выполняются заново)? Такой сайт явно долго не проживет, верно? Я нашел статью в документации, где описывается возможность создания постоянного соединения. Но тогда соединение станет разделяемым ресурсом. Кто позаботится о синхронизации доступа к нему? Прошу гуру PHP, читающих данный пост помочь разобраться в данном вопросе. Опишите, пожалуйста, как будет работать PHP nginx php-fpm на достаточно нагруженном проекте (масштаба пикабушечки например), как быть с этим постоянным соединением и кто тогда разруливает параллельный доступ запущенных PHP процессов к нему. Спасибо!


Ответы (2 шт):

Автор решения: MERDY

Часто используют пул-соединения, например pgbouncer для PostgreSQL, есть и другие аналоги для MySQL, MSSQL, etc.

→ Ссылка
Автор решения: Ипатьев

Такой сайт явно долго не проживет, верно?

Нет. Живут и процветают.

Это типичный пример умозрительных построений на неизвестных величинах. Рассуждение уровня "В рыбе содержится ртуть и мышьяк. Если есть рыбу, то отравишься и умрёшь". Начинающие программисты особенно склонны к таким фантазиям, не имеющим ничего общего с реальностью.

Коннект к БД не настолько ужасно невероятно чудовищно тяжёлая в плане потребления ресурсов операция. И наш нубский сайт сначала сто раз упадет из-за неоптимального SQL, кривых алгоритмов, блокировок и еще примерно миллиона причин, перед тем как упереться в скорость коннекта.

Способ есть, но у него есть как достоинства так и недостатки. И в 99% случаев недостатки перевешивают достоинства. В мускуле это pconnect. Причем в ПДО он реализован криво, новый скрипт не очищает состояние коннекта - то есть в нем могут оказаться незавершенные транзакции, неснятые блокировки, и т.д.
Mysqli в этом плане лучше, но и профит меньше - потому что такая очистка и занимает львиную долю того времени, которое экономит постоянное соединение.

Но тогда соединение станет разделяемым ресурсом.

Не станет

кто тогда разруливает параллельный доступ запущенных PHP процессов к нему.

фпм и разруливает. у каждого треда своё соединение. один тред всегда обслуживает одно соединение с веб-сервером, то есть никакого параллельного использования коннектов не будет.

→ Ссылка