Всем привет, В нашей компании порядка 2000 пользователей, одновременно работать могут около 200. Корпоративные веб-приложения работают с БД через Zend, соединение с PgSQL устанавливается при каждом вызове скрипта PHP, под одной и той же учётной записью PgSQL. Постоянное соединение с PostgreSQL не используется. Так же активно используется AJAX, таким образом, одновременно может "висеть" до 200 активных сессий в БД. Всё вроде бы нормально, но есть какие-то необъяснимые пока "лаги" в виде 5 сек, которые возникают в PHP при обращении к БД. Профилировщик PHP показывает на Zend. В целом, каждый 20-й запрос затыкается на 5 сек, при этом на самой БД такой задержки при выполнении запросов не наблюдается. То ли долго летит, то ли долго прилетает обратно. Но вопрос не в этом... Возможности использовать постоянные соединения с БД нет, т.к. PHP не позволяет "пробросить" хост клиента на БД. Или я не понимаю, как это можно сделать. Если просто включить постоянные соединения - все клиенты начинают ломиться в один порт, и PgSQL "падает" в блокировки. Zend работает через PDO, соответственно работа с БД идёт через драйвер PHP_PDO для PgSQL. При этом, согласно документации, Zend при инициализации соединения не создаёт коннект, а только подготавливает: Creating an instance of an Adapter class does not immediately connect to the RDBMS server. The Adapter saves the connection parameters, and makes the actual connection on demand, the first time you need to execute a query. Чисто теоретически, можно было бы подумать над тем, чтобы установить соединение с БД один раз, сохранить его в сессии PHP, например, и использовать без повторной инициализации, но есть ли в этом смысл? То есть вопрос такой: Можно ли каким-то образом "держать" коннекты для каждого пользователя веб персонально? UPD "Лаги" вылечили, они были по вине неверной настройки DNS. Но суть вопроса не изменилась... интересуют ваши практики организации соединений PHP с БД
В сессии нельзя хранить ресурсы/объекты для подключения к БД. Возможно, спасут PHP: Постоянные соединения с базами данных - Manual
Постоянные соединения не спасут, т.к. все подключения к БД со стороны СУБД будут выглядеть как один хост, и все клиенты ломанутся в одно подключение, БД в итоге очень быстро упадёт. Проверено ))
Hello Check below Connection Caching: Implement a short-lived connection caching mechanism to reduce connection overhead. Database Connection Pooling: Explore connection pooling solutions to manage and reuse database connections efficiently. Connection Management: Optimize connection management in PHP scripts, promptly closing connections after use. Profiling and Monitoring: Use profiling tools to identify delays and monitor database server loads during lag periods. Query Optimization: Ensure optimized queries and proper indexing to improve database performance. Load Balancing: Consider load balancing across multiple database servers for better scalability.