Модуль mysqli та постійні з'єднання

Ідея постійних підключень полягає в тому, щоб з'єднання між клієнтським процесом і базою даних можна використовувати повторно, особливо коли потрібно створювати і закривати з'єднання безліч разів. Це дозволило б знизити накладні витрати на створення нових підключень щоразу, коли вони потрібні, за рахунок використання існуючих кешованих підключень, вільних для повторного використання.

На відміну від модуля mysql, mysqli немає окремої функції для створення постійних з'єднань. Щоб відкрити постійне з'єднання, під час створення підключення до імені хоста потрібно додати префікс p:

При використанні постійних з'єднань можна зіткнутися з проблемою, яка полягає в тому, що клієнти можуть залишати такі підключення у непередбачуваному стані. Наприклад, клієнт ставить блокування таблицю, а потім аварійно завершує роботу. Тобто блокування знято не буде. Новий клієнтський процес, який використовує це підключення повторно, отримає його як є, і змушений буде провести якесь очищення підключення, перш ніж почати його використовувати. Відповідно, завдання програміста входить ще й перевірка подібних ситуацій і впровадження коду, що здійснює таку очищення.

Тим не менш, у mysqli цю проблему вирішено. У модулі є вбудований функціонал, що здійснює очищення з'єднань і переводить їх у стан, придатний для використання. Код очищення, реалізований у mysqli включає наступні операції:

  • Відкат активних транзакцій

  • Закриття та видалення тимчасових таблиць

  • Зняття блокування з таблиць

  • Скидання змінних сесії

  • Закриття підготовлених запитів (завжди відбувається у PHP)

  • Закриття обробників

  • Зняття блокувань, встановлених функцієюGET_LOCK()

Це дозволяє бути впевненим у тому, що повернені з пулу з'єднання готові до використання у клієнтських процесах.

Модульmysqli робить очищення з'єднань автоматично шляхом виклику C-API функції mysql_change_user()

Автоматичне очищення має свої переваги та недоліки. Як плюс, програмісту більше не треба дбати про очищення з'єднання, все робиться автоматично. Однак, це не найкраще впливає на продуктивність, скрипт потенційно може працювати повільніше, оскільки автоматичне чищення запускається щоразу, коли з'єднання витягується з пула.

Є можливість вимкнути автоматичне очищення з'єднань, якщо скомпілювати PHP з директивою MYSQLI_NO_CHANGE_USER_ON_PCONNECT

Зауваження :

Постійні з'єднання підтримуються модулем mysqli як під час роботи з рідним MySQL-драйвером, так і при роботі з клієнтською бібліотекою MySQL.