Пул з'єднань у PHP


76

Чи можна кешувати підключення до бази даних при використанні PHP, як це було б у контейнері J2EE? Якщо так, то як?


1
Ви розглядали постійні з'єднання за допомогою mysql_pconnect () ?
Chris Bartow,

Як щодо цього? github.com/junamai2000/mod_namy_pool
нам

Насправді в PHP є щось про пул з'єднань, перегляньте посібник: php.net/manual/en/mysqlnd-ms.pooling.php та php.net/manual/en/mysqlnd-mux.connection_pool.php
Фелікс Хуанг

Відповіді:


57

Пул з'єднань у php відсутній .
mysql_pconnect та пул з'єднань - це дві різні речі. З цим пов’язано багато проблем, mysql_pconnectі спочатку слід прочитати інструкцію та обережно користуватися нею, але це не об’єднання зв’язків.

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

Ми можемо зробити масштабування з’єднання в php для цього, будь ласка, перейдіть за таким посиланням: http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html

Тож ніякого об’єднання підключень у php.

Як сказав Хуліо, apache звільняє всі ресурси, коли запит закінчується для поточних запитів. Ви можете використовувати mysql_pconnect, але ця функція обмежена, і ви повинні бути дуже обережними. Інший вибір - використовувати одиночний шаблон, але нічого з цього не є об’єднанням.

Це хороша стаття: https://blogs.oracle.com/opal/highly-scalable-connection-pooling-in-php

Також прочитайте цей http://www.apache2.es/2.2.2/mod/mod_dbd.html


16
Немає пулу з'єднань? Ого.
Джастін

2
"Підключення до SQL-сервера не буде закрито, коли закінчиться виконання сценарію." - php.net/manual/en/function.mysql-pconnect.php
RandomSeed

2
Робоче посилання для блогу oracle: blogs.oracle.com/opal/entry/highly_scalable_connection_poo
Луїс Муньос

15

Постійні зв’язки - це не що інше, як об’єднання зв’язків. Постійне з’єднання в php буде повторно використано лише в тому випадку, якщо ви встановите кілька підключень db в одному контексті виконання запиту / сценарію. У більшості типових сценаріїв веб-розробників ви швидше розширюєте свої з’єднання, якщо використовуєте mysql_pconnect, оскільки ваш скрипт не зможе отримати посилання на будь-які відкриті з’єднання у вашому наступному запиті. Найкращий спосіб використовувати db-з'єднання у php - це створити односторонній екземпляр об'єкта db, щоб з'єднання було повторно використано в контексті виконання вашого сценарію. Це як і раніше вимагає щонайменше 1 дБ підключення на запит, але це краще, ніж створення кількох дБ підключень на запит.

Не існує реального об'єднання з'єднань db у php через природу php. Php - це не сервер додатків, який може сидіти там між проханнями та керувати посиланнями на пул відкритих з'єднань, принаймні не без якогось серйозного злому. Я думаю, що теоретично ви можете написати сервер додатків на php і запустити його як скрипт командного рядка, який просто сидить там у фоновому режимі і тримає купу db-з'єднань відкритими і передає посилання на них вашим іншим сценаріям, але я не знайте, чи можливо це буде на практиці, як ви передасте посилання зі свого сценарію командного рядка іншим сценаріям, і я сумніваюся, що він буде працювати добре, навіть якщо ви зможете його виконати. У будь-якому випадку це в основному спекуляція. Я щойно помітив посилання, яке хтось інший розмістив на модулі apache, щоб дозволити пул з'єднань для серверів prefork, таких як php. https://github.com/junamai2000/mod_namy_pool#readme


3
"Підключення до SQL-сервера не буде закрито, коли закінчиться виконання сценарію." - php.net/manual/en/function.mysql-pconnect.php
RandomSeed

"Найкращий спосіб використовувати db-з'єднання у php - це створити односторонній екземпляр об'єкта db, щоб з'єднання було повторно використано в контексті виконання вашого сценарію." - Це золота гуска, яку я шукаю. Чудовий спосіб пояснити, де і чому синглтон був би корисним!
самазі

9

Припускаю, ви використовуєте mod_php, так?

Коли PHP-файл закінчує виконувати всі свої стани, вбивається, тому немає можливості (у коді PHP) зробити пул з'єднань. Натомість вам доведеться покладатися на розширення.

Ви можете mysql_pconnect, щоб ваші зв’язки не закривалися після завершення сторінки, таким чином вони будуть використані повторно в наступному запиті.

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


3
Чи можуть з’єднання використовувати повторно різні користувачі? Якщо так, то чому в посібнику сказано, що нам слід налаштувати MySQL, щоб уникнути занадто великої кількості з’єднань?
omg

7

Ви можете використовувати MySQLi .

Для отримання додаткової інформації прокрутіть униз до розділу Пул з'єднання @ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622

Зауважте, що пул з'єднань також залежить від вашого сервера (тобто Apache httpd) та його конфігурації.


1
Цю відповідь слід модифікувати, оскільки всі інші дуже старі. Пул з'єднань та проблеми, які це може спричинити, цілком реальні!
Alexp

1

Пул з'єднань працює на стороні сервера MySQL так.

  1. Якщо постійне з'єднання ввімкнено в конфігурації сервера MySQL, то MySQL підтримує з'єднання відкритим і перебуває в режимі сну після того, як запитуваний клієнт (php-скрипт) закінчить свою роботу і загине.
  2. Коли 2-й запит надходить із однаковими даними облікових даних (те саме ім’я користувача, той самий пароль, той самий параметр підключення, те саме ім’я бази даних, можливо, з того самого IP, я не впевнений в IP) Тоді MySQL об’єднує попереднє з’єднання із стану сну в активний стан і дозвольте клієнтові використовувати підключення. Це допомагає MySQL заощадити час на початковий ресурс для підключення та зменшити загальну кількість підключень.

Тож параметр пулу з'єднань фактично доступний на стороні сервера MySQL. У кінці коду PHP немає можливості. mysql_pconnect () - це просто обгортка, яка повідомляє PHP не надсилати сигнал запиту на закриття з'єднання в кінці запуску сценарію.


0

Ви не можете створити екземпляр пулів підключень вручну.

Але ви можете використовувати "вбудований" пул з'єднань за допомогою функції mysql_pconnect .


0

Я хотів би запропонувати PDO::ATTR_PERSISTENT

Постійні зв’язки - це посилання, які не закриваються після завершення виконання вашого сценарію. Коли надсилається запит на постійне з’єднання, PHP перевіряє, чи вже існує ідентичне постійне з’єднання (яке залишалося відкритим із попереднього) - і якщо воно існує, воно використовує його. Якщо він не існує, він створює посилання.


0

Якщо невикористаного постійного з'єднання для заданої комбінації "хост, ім'я користувача, пароль, сокет, порт і базу даних за замовчуванням не вдається знайти" у відкритому пулі з'єднань, тоді лише mysqli відкриває нове з'єднання, інакше воно буде використовувати повторно вже відкриті доступні постійні з'єднання , який певним чином схожий на концепцію об'єднання з'єднань. Використання постійних з'єднань можна ввімкнути та вимкнути за допомогою директиви PHP mysqli.allow_persistent. Загальну кількість з'єднань, відкритих сценарієм, можна обмежити за допомогою mysqli.max_links (це може бути вам цікаво для вирішення проблеми max_user_connections, яка впливає на ліміт хостинг-сервера). Максимальна кількість постійних з'єднань на PHP-процес може бути обмежена за допомогою mysqli.max_persistent.

У більш широкому контексті програмування це завдання веб-сервера / сервера додатків, однак у цьому контексті це обробляється директивою mysqli самого PHP таким чином, що підтримує повторну зручність використання з'єднання. Ви також можете реалізувати одномісний клас, щоб отримати статичний екземпляр підключення для повторного використання, як у Java. Просто хочу нагадати, що Java також не підтримує пул з'єднань як частину свого стандартного JDBC, вони є різними модулями / шарами поверх драйверів JDBC.

Що стосується PHP, то добре, що для загальних баз даних в ехосистемі PHP він підтримує постійні підключення до бази даних, які зберігають з'єднання для 500 запитів (конфігурація max_requests у php.ini), і це дозволяє уникнути створення нового з'єднання в кожному запиті. Тож детально ознайомтесь із цим у документації, це вирішує більшість ваших проблем. Зверніть увагу, що PHP не настільки витончений з точки зору розширеного багатопотокового механізму та одночасної обробки разом із потужною асинхронною обробкою подій у порівнянні із суворо об'єктно-орієнтованою Java. Отже, для PHP є менш ефективним такий вбудований механізм, як пул.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.