Расширение mysqli и постоянные соединения


Для расширения mysqli поддержка постоянных соединений была внедрена в PHP 5.3. В PDO MYSQL и ext/mysql на тот момент она уже была. Идея постоянных подключений состоит в том, чтобы соединение между клиентским процессом и базой данных можно было использовать повторно, особенно когда требуется создавать и закрывать соединения множество раз. Это бы позволило снизить накладные расходы на создание новых подклюений каждый раз, когда они требуются, за счет использования существующих кэшированных подключений, свободных для повторного использования.

В отличие от расширения mysql, в mysqli нет отдельной функции для создания постоянных соединений. Чтобы открыть постоянное соединение, при создании подключения к имени хоста нужно добавить префикс p:.

При использовании постоянных соединений можно столкнуться с проблемой, которая заключается в том, что клиенты могут оставлять такие подключения в непредсказуемом состоянии. Например, клиент ставит блокировку на таблицу, а затем аварийно завершает работу. То есть блокировка снята не будет. Новый клиентский процесс, использующий это подключение повторно, получит его "как есть", и вынужден будет провести какую-то очистку подключения, прежде чем начать его использовать. Соответственно в задачи программиста входит еще и проверка подобных ситуаций и внедрение кода, осуществляющего такую очистку.

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

  • Откат активных транзакций

  • Закрытие и удаление временных таблиц

  • Снятие блокировки с таблиц

  • Сброс переменных сессии

  • Закрытие подготовленных запросов (всегда происходит в PHP)

  • Закрытие обработчиков

  • Снятие блокировок, установленных функцией GET_LOCK()

Это позволяет быть уверенным в том, что возвращенные из пула соединения готовы к использованию в клиентских процессах.

Расширение mysqli делает очистку соединений автоматически путем вызова C-API функции mysql_change_user().

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

Есть возможность отключить автоматическую очистку соединений, если скомпилировать PHP с директивой MYSQLI_NO_CHANGE_USER_ON_PCONNECT.

Замечание:

Постоянные соединения поддерживаются расширением mysqli как при работе с родным MySQL драйвером, так и при работе с клиентской библиотекой MySQL.