Постоянные соединения с БД (PHP). Как это работает?
PHP, запускаясь и отрабатывая, "умирает". Такова его механика работы. И во многом это, прям , круто. Безопасно. Однако тут вопрос. Как это все работает с соединением с БД? Если на сайте хайлоад, то каждый новый запрос из браузера будет делать новое соединение с БД (ведь все скрипты выполняются заново)? Такой сайт явно долго не проживет, верно? Я нашел статью в документации, где описывается возможность создания постоянного соединения. Но тогда соединение станет разделяемым ресурсом. Кто позаботится о синхронизации доступа к нему? Прошу гуру PHP, читающих данный пост помочь разобраться в данном вопросе. Опишите, пожалуйста, как будет работать PHP nginx php-fpm на достаточно нагруженном проекте (масштаба пикабушечки например), как быть с этим постоянным соединением и кто тогда разруливает параллельный доступ запущенных PHP процессов к нему. Спасибо!
Ответы (2 шт):
Часто используют пул-соединения, например pgbouncer для PostgreSQL, есть и другие аналоги для MySQL, MSSQL, etc.
Такой сайт явно долго не проживет, верно?
Нет. Живут и процветают.
Это типичный пример умозрительных построений на неизвестных величинах. Рассуждение уровня "В рыбе содержится ртуть и мышьяк. Если есть рыбу, то отравишься и умрёшь". Начинающие программисты особенно склонны к таким фантазиям, не имеющим ничего общего с реальностью.
Коннект к БД не настолько ужасно невероятно чудовищно тяжёлая в плане потребления ресурсов операция. И наш нубский сайт сначала сто раз упадет из-за неоптимального SQL, кривых алгоритмов, блокировок и еще примерно миллиона причин, перед тем как упереться в скорость коннекта.
Способ есть, но у него есть как достоинства так и недостатки. И в 99% случаев недостатки перевешивают достоинства. В мускуле это pconnect. Причем в ПДО он реализован криво, новый скрипт не очищает состояние коннекта - то есть в нем могут оказаться незавершенные транзакции, неснятые блокировки, и т.д.
Mysqli в этом плане лучше, но и профит меньше - потому что такая очистка и занимает львиную долю того времени, которое экономит постоянное соединение.
Но тогда соединение станет разделяемым ресурсом.
Не станет
кто тогда разруливает параллельный доступ запущенных PHP процессов к нему.
фпм и разруливает. у каждого треда своё соединение. один тред всегда обслуживает одно соединение с веб-сервером, то есть никакого параллельного использования коннектов не будет.