API плагінів mysqlnd
API плагінів mysqlnd
предоставляет следующие функции:
-
mysqlnd_plugin_register()
-
mysqlnd_plugin_count()
-
mysqlnd_plugin_get_plugin_connection_data()
-
mysqlnd_plugin_get_plugin_result_data()
-
mysqlnd_plugin_get_plugin_stmt_data()
-
mysqlnd_plugin_get_plugin_net_data()
-
mysqlnd_plugin_get_plugin_protocol_data()
-
mysqlnd_conn_get_methods()
-
mysqlnd_result_get_methods()
-
mysqlnd_result_meta_get_methods()
-
mysqlnd_stmt_get_methods()
-
mysqlnd_net_get_methods()
-
mysqlnd_protocol_get_methods()
Немає стандартних визначень того, що таке плагін та як він працює.
Часто зустрічаються в плагінах компоненти:
-
Менеджер плагіна
-
API плагіна
-
Сервіси програми (або модулі)
-
API сервісів програми (або API модулів)
Концепция плагинаmysqlnd
експлуатує цю функціональність і, крім того, тішить нас відкритою архітектурою.
Немає заборон
Плагін має повний доступ до всіх нутрощів. mysqlnd
. Немає обмежень або заборон, пов'язаних із безпекою. Все, що завгодно, можна переписати для реалізації дружніх або ворожих алгоритмів, так що рекомендується ставити плагіни тільки з довірених джерел.
Як обговорювалося вище, плагіни можуть вільно використовувати покажчики. Ці покажчики нічим не обмежені і можуть вказувати дані іншого плагіна. Найпростіша арифметична операція дозволить отримати доступ до даних іншого плагіна.
Рекомендується писати плагіни, що співпрацюють, які можуть працювати спільно з іншими плагінами і завжди викликати батьківські методи. Плагіни ніколи не повинні поводитися вороже до самого mysqlnd
Проблеми: приклад співробітництва та побудови ланцюжка
Модуль | Указатель mysqlnd.query() | Стек вызова, если вызывается родитель |
---|---|---|
ext/mysqlnd | mysqlnd.query() | mysqlnd.query |
ext/mysqlnd_cache | mysqlnd_cache.query() |
-
mysqlnd_cache.query()
-
mysqlnd.query
| | ext/mysqlnd_monitor | mysqlnd_monitor.query() |
-
mysqlnd_monitor.query()
-
mysqlnd_cache.query()
-
mysqlnd.query
У цьому сценарії завантажені плагіни кеша (ext/mysqlnd_cache
) та моніторингу (ext/mysqlnd_monitor
). Оба наследуют классConnection::query()
. реєстрація плагінів відбувається на етапі MINIT
відповідно до описаної вище логіки. PHP за замовчуванням викликає модулі в алфавітному порядку. Плагіни не знають один про одного і не накладають будь-яких залежностей.
За умовчанням, плагіни викликають батьківський метод query зі своєї, перевизначеної, версії цього методу.
Резюме з модуля PHP
Повторення пройденого матеріалу на прикладі поведінки плагіна ext/mysqlnd_plugin
, що використовує API плагінів mysqlnd
для PHP:
-
Будь-яка програма PHP, що використовує MySQL намагається встановити з'єднання за адресою 192.168.2.29
-
Додаток використовує один із наступних модулів
ext/mysql
ext/mysqli
илиPDO_MYSQL
. Усі три модулі використовуютьmysqlnd
для з'єднання з 192.168.2.29. -
Mysqlnd
викликає метод з'єднання, який успадковується плагіномext/mysqlnd_plugin
-
ext/mysqlnd_plugin
викликає зареєстрований користувачем методproxy::connect()
-
Цей метод підміняє IP адресу з'єднання з 192.168.2.29 на 127.0.0.1 та повертає встановлене
parent::connect()
соединение. -
ext/mysqlnd_plugin
робить те саме, що іparent::connect(127.0.0.1)
викликаючи оригінальний методmysqlnd
для соединения. -
ext/mysqlnd
встановлює з'єднання та повертає йогоext/mysqlnd_plugin
. .ext/mysqlnd_plugin
, своєю чергою, передає його далі. -
Не має значення, який модуль був використаний, він все одно отримає з'єднання до 127.0.0.1. Після цього модуль повертає це з'єднання додатку. Коло замкнулося.