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/mysqlndmysqlnd.query()mysqlnd.query
ext/mysqlnd_cachemysqlnd_cache.query()
  1. mysqlnd_cache.query()

  2. mysqlnd.query

| | ext/mysqlnd_monitor | mysqlnd_monitor.query() |

  1. mysqlnd_monitor.query()

  2. mysqlnd_cache.query()

  3. 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. Після цього модуль повертає це з'єднання додатку. Коло замкнулося.