Чи можна кешувати підключення до бази даних при використанні PHP, як це було б у контейнері J2EE? Якщо так, то як?
Чи можна кешувати підключення до бази даних при використанні PHP, як це було б у контейнері J2EE? Якщо так, то як?
Відповіді:
Пул з'єднань у 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
Постійні зв’язки - це не що інше, як об’єднання зв’язків. Постійне з’єднання в 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
Припускаю, ви використовуєте mod_php, так?
Коли PHP-файл закінчує виконувати всі свої стани, вбивається, тому немає можливості (у коді PHP) зробити пул з'єднань. Натомість вам доведеться покладатися на розширення.
Ви можете mysql_pconnect, щоб ваші зв’язки не закривалися після завершення сторінки, таким чином вони будуть використані повторно в наступному запиті.
Це може бути все, що вам потрібно, але це не те саме, що пул з'єднань, оскільки немає можливості вказати кількість з'єднань, які слід підтримувати відкритими.
Ви можете використовувати MySQLi .
Для отримання додаткової інформації прокрутіть униз до розділу Пул з'єднання @ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622
Зауважте, що пул з'єднань також залежить від вашого сервера (тобто Apache httpd) та його конфігурації.
Пул з'єднань працює на стороні сервера MySQL так.
Тож параметр пулу з'єднань фактично доступний на стороні сервера MySQL. У кінці коду PHP немає можливості. mysql_pconnect () - це просто обгортка, яка повідомляє PHP не надсилати сигнал запиту на закриття з'єднання в кінці запуску сценарію.
Ви не можете створити екземпляр пулів підключень вручну.
Але ви можете використовувати "вбудований" пул з'єднань за допомогою функції mysql_pconnect .
Я хотів би запропонувати PDO::ATTR_PERSISTENT
Постійні зв’язки - це посилання, які не закриваються після завершення виконання вашого сценарію. Коли надсилається запит на постійне з’єднання, PHP перевіряє, чи вже існує ідентичне постійне з’єднання (яке залишалося відкритим із попереднього) - і якщо воно існує, воно використовує його. Якщо він не існує, він створює посилання.
Якщо невикористаного постійного з'єднання для заданої комбінації "хост, ім'я користувача, пароль, сокет, порт і базу даних за замовчуванням не вдається знайти" у відкритому пулі з'єднань, тоді лише 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 є менш ефективним такий вбудований механізм, як пул.