mysqlnd_plugin_api


22.9.5.8. API MySQL Native Driver Plugin

API MySQL Native Driver Plugin является функцией MySQL Native Driver, или mysqlnd . Mysqlnd плагины работают в уровне между приложениями PHP и сервером MySQL. Это сопоставимо с MySQL Proxy. MySQL Proxy управляет на уровне между любым клиентским приложением MySQL, например, приложением PHP и, сервер MySQL. Mysqlnd плагины могут предпринять типичные задачи MySQL Proxy, такие как выравнивание нагрузки, контроль и оптимизация производительности. Из-за различной архитектуры и расположения, mysqlnd у плагинов нет некоторых из недостатков Прокси MySQL. Например, с плагинами, нет никакой единственной точки отказа, никакой выделенный прокси-сервер, чтобы развернуться, и никакой новый язык программирования, чтобы учиться (Lua).

A mysqlnd плагин может считаться расширением mysqlnd . Плагины могут прервать большинство mysqlnd функции. mysqlnd функции вызываются расширениями MySQL PHP такой как ext/mysql , ext/mysqli , и PDO_MYSQL . В результате это возможно для a mysqlnd плагин, чтобы прервать все вызовы, выполненные к этим расширениям из клиентского приложения.

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

Mysqlnd плагины являются фактически Расширениями PHP, записанными в C, то использование mysqlnd сменный API (который встраивается в MySQL Native Driver, mysqlnd ). Плагины могут быть сделаны 100 %, прозрачными к приложениям PHP. Никакие изменения приложения не необходимы, потому что плагины работают на различном уровне. mysqlnd плагин может считаться работающий в уровне ниже mysqlnd .

Следующий список представляет некоторые возможные приложения mysqlnd плагины.

Разделение чтения-записи. Примером этого является PECL/mysqlnd_ms (Основное Ведомое устройство) расширение. Это расширение разделяет запросы чтения-записи для установки репликации.

Круговой, наименее загруженный

Контроль запроса. Примером этого является PECL/mysqlnd_sip (Защита Инжекции SQL) расширение. Это расширение осматривает запросы и выполняет только тех, которые разрешаются согласно ruleset.

Кэширование. Примером этого является PECL/mysqlnd_qc (Кэш Запроса) расширение.

Sharding. Примером этого является PECL/mysqlnd_mc (Много, Соединяются), расширение. Это расширение попытается разделить оператор SELECT на n-части, используя ИЗБРАННЫЙ. ОГРАНИЧЬТЕ part_1, ВЫБЕРИТЕ ПРЕДЕЛ part_n. Это отправляет запросы отличным серверам MySQL и объединяет результат в клиенте.

MySQL Native Driver Plugins Available

Есть много mysqlnd плагинов, уже доступных. Они включают:

PECL/mysqlnd_mc — Много Соединяют плагин.

PECL/mysqlnd_ms — Основной Ведомый плагин.

PECL/mysqlnd_qc — плагин Кэша Запроса.

PECL/mysqlnd_pscache — Готовый плагин Кэша описателей Оператора.

PECL/mysqlnd_sip — плагин Защиты Инжекции SQL.

PECL/mysqlnd_uh — Пользовательский плагин Обработчика.

22.9.5.8.1. Сравнение mysqlnd плагинов с MySQL Proxy

Mysqlnd плагины и MySQL Proxy являются различными технологиями, используя разные подходы. И допустимые инструменты для того, чтобы решить множество общих задач, таких как выравнивание нагрузки, контроль, и улучшения производительности. Важное различие — то, что MySQL Proxy работает со всеми клиентами MySQL, тогда как mysqlnd плагины являются определенными для приложений PHP.

Как Расширение PHP, a mysqlnd плагин устанавливается на сервере приложений PHP, наряду с остальной частью PHP. MySQL Proxy может или быть выполнен на сервере приложений PHP или может быть установлен на выделенной машине, чтобы обработать многократные серверы приложений PHP.

У развертывания MySQL Proxy на сервере приложений есть два преимущества:

Никакая единственная точка отказа

Легкий масштабировать (горизонтальный масштаб, масштабируйтесь клиентом),

MySQL Proxy (и mysqlnd плагины), может решить проблемы легко, которые иначе потребовали бы изменений к существующим приложениям.

Однако, у MySQL Proxy действительно есть некоторые недостатки:

MySQL Proxy является новым компонентом и технологией ведущему устройству, и развернуться.

MySQL Proxy требует знания языка сценариев Lua.

MySQL Proxy может быть настроен с программированием C и Lua. Lua является привилегированным языком сценариев MySQL Proxy. Поскольку большинство экспертов PHP Луы является новым языком, чтобы учиться. A mysqlnd плагин может быть записан в C. Также возможно записать плагины в PHP, использующем PECL/mysqlnd_uh .

MySQL Proxy работает как демон — фоновый процесс. MySQL Proxy может напомнить более ранние решения, поскольку все состояние может быть сохранено. Однако, a mysqlnd плагин связывается с основанным на запросе жизненным циклом PHP. MySQL Proxy может также совместно использовать одноразовые вычисленные результаты среди многократных серверов приложений. A mysqlnd плагин должен был бы хранить данные в персистентном носителе, чтобы быть в состоянии сделать это. Другой демон должен был бы использоваться с этой целью, такие как Memcache. Это дает MySQL Proxy преимущество в этом случае.

MySQL Proxy работает сверху проводного протокола. С MySQL Proxy необходимо проанализировать и перепроектировать MySQL Client Server Protocol. Действия ограничиваются теми, которые могут быть достигнуты, управляя протоколом связи. Если проводной протокол изменяется (который происходит очень редко), сценарии MySQL Proxy должны были бы быть изменены также.


Mysqlnd плагины работают сверху API C, который зеркально отражает libmysqlclient клиент и API Connector/C. Этот API C является в основном оберткой вокруг протокола MySQL Client Server, или проводного протокола, как это иногда вызывают. Можно прервать все вызовы API C. PHP использует API C, поэтому можно сцепить все вызовы PHP без потребности программировать на уровне проводного протокола.

Mysqlnd реализует проводной протокол. Плагины могут поэтому проанализировать, перепроектировать, управлять и даже заменить протокол связи. Однако, это обычно не требуется.

Поскольку плагины позволяют Вам создавать реализации, которые используют два уровня (C API и соединяют протокол проводом), у них есть большая гибкость чем MySQL Proxy. Если a mysqlnd плагин реализуется, используя API C, любые последующие изменения к проводному протоколу не требуют изменений к плагину непосредственно.

22.9.5.8.2. Получение mysqlnd сменного API

mysqlnd сменный API является просто частью расширения MySQL Native Driver PHP, ext/mysqlnd . Разработка, запущенная на mysqlnd сменный API в декабре 2009. Это разрабатывается, поскольку часть исходного репозитария PHP, и как таковой доступна общественности или через Мерзавца, или посредством исходных загрузок снимка.

Следующая таблица показывает версии PHP и соответствие mysqlnd версия, содержавшая в пределах.

Таблица 22.69. Связанная mysqlnd версия на выпуск PHP

Версия PHP Версия MySQL Native Driver
5.3.0 5.0.5
5.3.1 5.0.5
5.3.2 5.0.7
5.3.3 5.0.7
5.3.4 5.0.7

Сменные разработчики могут определить mysqlnd версия посредством доступа MYSQLND_VERSION , который является строкой формата » mysqlnd 5.0.7-dev — 091210 — $Revision: 300535 » , или через MYSQLND_VERSION_ID , который является целым числом такой как 50007. Разработчики могут вычислить номер версии следующим образом:

Таблица 22.70. Таблица вычисления MYSQLND_VERSION_ID

Версия (часть)
Пример
Major*10000 5*10000 = 50000
Minor*100 0*100 = 0
Патч 7 = 7
MYSQLND_VERSION_ID 50007

Во время разработки разработчики должны обратиться к mysqlnd номер версии для совместимости и тестов версии, как несколько итераций mysqlnd мог произойти во время времени жизни ответвления разработки PHP с единственным номером версии PHP.

22.9.5.8.3. MySQL Native Driver Plugin Architecture

Этот раздел обеспечивает краткий обзор mysqlnd сменная архитектура.

MySQL Native Driver Overview

Перед разработкой mysqlnd плагины, полезно знать немногое как mysqlnd непосредственно организуется. Mysqlnd состоит из следующих модулей:

Таблица 22.71. mysqlnd организационная схема, на модуль

Статистика модулей mysqlnd_statistics.c
Соединение mysqlnd.c
Набор результатов mysqlnd_result.c
Метаданные набора результатов mysqlnd_result_meta.c
Оператор mysqlnd_ps.c
Сеть mysqlnd_net.c
Проводной протокол mysqlnd_wireprotocol.c

C Объектно-ориентированная Парадигма

На уровне кода, mysqlnd использует образец C для того, чтобы реализовать объектную ориентацию.

В C Вы используете a struct представлять объект. Элементы struct представляют объектные свойства. Элементы Struct, указывающие на функции, представляют методы.

В отличие от этого с другими языками, такими как C++ или Java, нет никаких закрепленных правил о наследовании в объектно-ориентированной парадигме C. Однако, есть некоторые соглашения, которые должны сопровождаться, который будет обсужден позже.

Жизненный цикл PHP

Рассматривая жизненный цикл PHP есть два основных цикла:

Запуск механизма PHP и цикл завершения работы

То, когда механизм PHP запустит это, вызовет инициализацию модуля (MINIT) функция каждого зарегистрированного расширения. Это позволяет каждому модулю устанавливать переменные и выделять ресурсы, которые будут существовать для времени жизни процесса механизма PHP. Когда механизм PHP завершит работу, он вызовет завершение работы модуля (MSHUTDOWN) функция каждого расширения.

Во время времени жизни механизма PHP это получит много запросов. Каждый запрос составляет другой жизненный цикл. По каждому запросу механизм PHP вызовет функцию инициализации запроса каждого расширения. Расширение может выполнить любую переменную установку и распределение ресурсов, требуемое для обработки запросов. Поскольку цикл запроса заканчивает вызовы механизма завершение работы запроса (RSHUTDOWN) функция каждого расширения, таким образом, расширение может выполнить любую требуемую уборку.

Как работает плагин

A mysqlnd сменные работы, прерывая вызовы, выполненные к mysqlnd расширениями то использование mysqlnd . Это достигается, получая mysqlnd функциональная таблица, поддерживая это, и заменяя это пользовательской функциональной таблицей, которая вызывает функции плагина как требуется.

Следующий код показывает как mysqlnd функциональная таблица заменяется:

Табличные манипуляции функцией соединения должны быть сделаны во время Инициализации Модуля (MINIT). Функциональная таблица является глобальным совместно используемым ресурсом. В многопоточной среде, с TSRM создают, манипулирование глобальным совместно используемым ресурсом во время обработки запросов почти наверняка приведет к конфликтам.


Не используйте логику фиксированного размера, управляя mysqlnd функциональная таблица: новые методы могут быть добавлены в конце функциональной таблицы. Функциональная таблица может измениться в любое время в будущем.

Вызов родительских методов

Если исходные функциональные записи таблицы поддерживаются, все еще возможно вызвать исходные функциональные записи таблицы — родительские методы.

В некоторых случаях, такой что касается Connection::stmt_init() , жизненно важно вызвать родительский метод до любого другого действия в полученном методе.

A mysqlnd объект представляется C struct. Не возможно добавить элемент к C struct во время выполнения. Пользователи mysqlnd объекты не могут просто добавить свойства к объектам.

Произвольные данные (свойства) могут быть добавлены к a mysqlnd объекты используя соответствующую функцию mysqlnd_plugin_get_plugin_ _data() семейство. Выделяя объект mysqlnd резервы располагают с интервалами в конце объекта содержать a void * указатель на произвольные данные. mysqlnd резервы располагают с интервалами для одного void * указатель на плагин.

Следующая таблица показывает, как вычислить позицию указателя для определенного плагина:

Таблица 22.72. Вычисления указателя для mysqlnd

Адрес памяти Содержание
Начало mysqlnd возражает C struct
n Конец mysqlnd возражает C struct
n + (м. x sizeof (освобождают *)), void*, чтобы возразить данным м. th плагин

Если Вы планируете разделить какой-либо на подклассы из mysqlnd возразите конструкторам, который позволяется, следует помнить это!

Следующие выставочные свойства расширения кода:

Сменный разработчик ответственен за управление сменной памятью данных.

Использование mysqlnd средство выделения памяти рекомендуется для сменных данных. Эти функции называют, используя соглашение: mnd_*loc() . mysqlnd у средства выделения есть некоторые полезные функции, такие как возможность использовать средство выделения отладки в неотладочная сборка.

Таблица 22.73. Когда и как разделить на подклассы

Соединение (MYSQLND)
MINIT Нет mysqlnd_conn_get_methods ()
Набор результатов (MYSQLND_RES) MINIT или позже Да mysqlnd_result_get_methods () или объектная работа с таблицами функции метода
Набор результатов Мета (MYSQLND_RES_METADATA) MINIT Нет mysqlnd_result_metadata_get_methods ()
Оператор (MYSQLND_STMT) MINIT Нет mysqlnd_stmt_get_methods ()
Сеть (MYSQLND_NET) MINIT или позже Да mysqlnd_net_get_methods () или объектная работа с таблицами функции метода
Проводной протокол (MYSQLND_PROTOCOL) MINIT или позже Да mysqlnd_protocol_get_methods () или объектный метод функционируют tablemanipulation

Не следует управлять функциональными таблицами в любое время позже чем MINIT, если он не позволяется согласно вышеупомянутой таблице.

Некоторые классы содержат указатель на таблицу функции метода. Все экземпляры такого class совместно используют ту же самую функциональную таблицу. Чтобы избежать хаоса, в особенности в поточных средах, такими функциональными таблицами нужно только управлять во время MINIT.

Другие классы используют копии глобально совместно используемой функциональной таблицы. Табличная копия функции class создается вместе с объектом. Каждый объект использует свою собственную функциональную таблицу. Это дает Вам две опции: можно управлять таблицей функции значения по умолчанию объекта в MINIT, и можно дополнительно совершенствовать методы объекта, не воздействуя на другие экземпляры того же самого class.

Преимущество совместно используемого функционального табличного подхода является производительностью. Нет никакой потребности скопировать функциональную таблицу для каждого объекта.

Таблица 22.74. Состояние конструктора

Плагин PHP mysqlnd sha256_password & quot; Доступ запрещен & quot ;, пользователь работает с cli mysql

Я пытаюсь защитить соединение mysql с помощью SSL и шифрования пароля с помощью sha256.
Моя установка работает, как и ожидалось, из cli mysql и при использовании собственного пароля mysql.
При попытке подключиться как пользователь с паролем sha256, я получаю «HY000 / 1045): доступ запрещен для пользователя« sha256user’@’192.168.120.45 »(используя пароль: YES)», но я могу подключить того же пользователя с помощью cli mysql.
У меня такая же проблема как на локальном, так и при попытке с удаленного хоста.

Моя настройка php:

Когда я использую пользователя с «собственным паролем», PHP использует соединение SSL.

Код подключения PHP:

Редактировать:
MySQL компилируется локально с:

У кого-нибудь есть идеи, где искать проблему?

Тема: Заменить драйвер php-mysql на php-mysqlnd в альтернативных версиях PHP

Опции темы
Поиск по теме

Заменить драйвер php-mysql на php-mysqlnd в альтернативных версиях PHP


Доброго дня!
Возникла необходимость заменить драйвер php-mysql на php-mysqlnd в альтернативных версиях PHP.
В нативной версии проблем не возникло, удалил без зависмостей:

А как подобное сделать для альтернативной версии?

Сейчас при /opt/php71/bin/php -i
показывает вот такую картину:

Жизненно необходимо для Laravel.

Тоже столкнулся с этой проблемой. Есть ли решение?

Присоединяюсь, есть такая проблема

Модули значит скомпилированы под libmysqlclient
Заменить можно только пересборкой

Да, так и есть, под libmysqlclient. Может быть есть инструкция на эту тему?

Нашел в /opt/php71/bin скрипты, которые, видимо используются панелью для компиляции. В частности, в php-config есть параметры, с которыми php собрано. Может кто-нибудь подскажет, как их использовать(и можно ли) для пересборки?

В общем, получилось. Скачал исходники той же версии, собрал pdo_myslq и подменил оригинальную библиотеку. Работает беспроблемно. Набросал инструкцию. Открыт вопрос с обновлением альт.версии php. Возможно, можно изменить php-config, если он не обновляется автоматически

Mysqlnd_plugin_api

An MySQL plugin for EssentialMode.

  • Download esplugin_mysql
  • Make sure you have mysql-async installed and working
  • Utilize FXMigrant if that doesn’t work use the below one
    • Import the SQL file provided with this project, esplugin_mysql.sql (Also be sure to remove the dependency from __resource.lua)
  • Add the following convar in your server configuration file: set es_enableCustomData 1 . Make sure you put it directly under mysql_connection_string
  • Make your load order is correct. Here’s how it should look:
  • © 2020 GitHub , Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

C: libmysqlclient — примеры работы с MySQL API

Немного за ним заскучал, ибо язык интересный и заставляет местами поломать голову, потому решил немного освежить память.


Ниже приводятся примеры работы с сервером MySQL/MariaDB на С, используя API из библиотеки libmysqlclient .

Примеры взяты из поста MySQL C API programming tutorial с небольшими изменениями и отсебятинкой.

Получившиеся примеры доступны в репозитории тут>>> .

Устаналиваем на Ubuntu/Debian с помощью apt :

Первый пример

Напишем первый пример, который выполнит подключение к серверу MySQL, и выведет его версию:

Убедимся, что это правда:

Кратко рассмотрим сам код:

  • #include и #include : включаем заголовочные файлы для работы с MySQL, которые расположены в каталоге /usr/include/mysql/ , путь к которому передадим через вызов mysql_config (см. ниже). В частности — /usr/include/mysql/mysql.h содежит описание mysql_get_client_info()
  • затем вызываем mysql_get_client_info() , которая возвращает версию используемой библиотеки

gcc и mysql_config

При компиляции выше мы использовали вызов mysql_config , что бы получить пути к используемым библиотекам и флагам сборки MySQL-клиента.

Можно вызвать mysql_config напрямую, что бы посмотреть эти данные:

Или отобразить только неоходимые данные, что мы и делаем при вызове gcc :

Создание базы данных

В следующем примере — выполним подключение к серверу и запрос на создание новой базы данных.

Тут нам потребуются данные доступа:

  • имя хоста — cdb-example.setevoy.org.ua (через CNAME направлено на AWS RDS инстанс с MariaDB)
  • имя пользователя — setevoy
  • пароль пользователя

Подключаемся к серверу БД, создаём пользоваеля:

Приступаем к коду:

testdb появилась, всё работает.

Процесс выполнения программы:

  • MYSQL *con = mysql_init(NULL) — с помощью mysql_init() инициализируем создание новой сессии для создания подключения
  • if (con == NULL) — проверяем его состояние, если сессия не создана — выходим с ошибкой, используя exit(1);
  • mysql_real_connect(con, «cdb-example.setevoy.org.ua», «setevoy», «p@ssw0rd») — используя mysql_real_connect() создаём подключение, используя созданную сессию ( con ), и передавая имя хоста, пользователя и пароль, и тут же проверяем его состояние с помощью if mysql_real_connect() == NULL
  • mysql_query(con, «CREATE DATABASE testdb») — с помощью mysql_query() выполняем запрос на создание базы данных
  • mysql_close() — закрываем сессию, созданную с помощью mysql_init()

Создание и наполнение таблицы

Теперь у нас есть пользователь, и база.

Следующим шагом — создадим в этой базе таблицу, и запишем в неё данные:

Тут, что бы не писать один и тот же код при каждом выполнении запросов к MySQL, мы сначала определяем единую функцию, которую будем использовать для проверки успешности подключения:

Затем подключаемся к базе, удаляем таблицу, если она есть ( mysql_query(con, «DROP TABLE IF EXISTS ExampleTable») ), создаём новую таблицу с тремя колонками ( mysql_query(con, «CREATE TABLE ExampleTable(Id INT, TextCol TEXT, IntCol INT)» ), и вносим тестовые данные ( mysql_query(con, «INSERT INTO ExampleTable VALUES(1, ‘TextValue’, 12345)») ).

Форум Pawn-Wiki.Ru — Воплоти мечту в реальность!: MySQL Plugin — Форум Pawn-Wiki.Ru — Воплоти мечту в реальность!


MySQL Plugin Version: 2.1.1 Оценка:

  • Группа: Пользователи
  • Сообщений: 24
  • Регистрация: 27 Июль 14

SA:MP My SQL Plugin
Version: 2.1.1

  • Это MySQL плагин, который позволяет подключиться к любой базе данных MySQL, чтобы сделать любой запрос и получить результаты;
  • Это самый быстрый и стабильный MySQL плагин в SA:MP;
  • Плагин также оснащен 28 консольными функциями.

  • native MySQL:mysql_init(logtype = LOG_ONLY_ERRORS, printerrors = 1);
  • native mysql_connect(const host[], const user[], const pass[], const db[], MySQL:handle = (MySQL:0), auto_reconnect = 0);
  • native mysql_close(MySQL:handle = MySQL:0);
  • native mysql_refresh(options, MySQL:handle = MySQL:0);
  • native mysql_select_db(const db[], MySQL:handle = MySQL:0);
  • native mysql_query(const query[], result >
  • native mysql_query_array(const query[], result >
  • native mysql_store_result(MySQL:handle = MySQL:0);
  • native mysql_free_result(MySQL:handle = MySQL:0);
  • native mysql_result_stored(MySQL:handle = MySQL:0);
  • native mysql_fetch_field(const fieldname[], dest[], MySQL:handle = MySQL:0);
  • native mysql_fetch_field_num(fieldnum, dest[], MySQL:handle = MySQL:0);
  • native mysql_fetch_row(dest[], const splitter[] = «|», MySQL:handle = MySQL:0);
  • native mysql_fetch_row_data(MySQL:handle = MySQL:0);
  • native mysql_real_escape_string(const string[], dest[], MySQL:handle = MySQL:0);
  • native mysql_num_rows(MySQL:handle = MySQL:0);
  • native mysql_num_fields(MySQL:handle = MySQL:0);
  • native mysql_affected_rows(MySQL:handle = MySQL:0);
  • native mysql_insert_ >
  • native mysql_ping(MySQL:handle = MySQL:0);
  • native mysql_error(dest[], MySQL:handle = MySQL:0);

  • native mysql_errno(MySQL:handle = MySQL:0);
  • native mysql_warning_count(MySQL:handle = MySQL:0();
  • native mysql_info(dest[], MySQL:handle = MySQL:0);
  • native mysql_stat(dest[], MySQL:handle = MySQL:0);
  • native mysql_get_server_info(dest[], MySQL:handle = MySQL:0);
  • native mysql_get_host_info(dest[], MySQL:handle = MySQL:0);
  • native mysql_data_seek(rownum, MySQL:handle = MySQL:0);
  • native mysql_set_character_set(const csname[], MySQL:handle = MySQL:0);
  • native mysql_get_character_set(csname[], MySQL:handle = MySQL:0);
  • native mysql_fetch_int(MySQL:handle = MySQL:0);
  • native mysql_fetch_float(MySQL:handle = MySQL:0);
  • native mysql_fetch_string(dest[], MySQL:handle = MySQL:0);
  • Как установить:

    • Windows:
    • Скачать плагин;
    • Поместить файл » mysql.dll» в папку с плагинами (/plugins/mysql.dll), а файл » libmysql.dll» в корневую папку с сервером (где расположен файл samp-server.exe);
    • Открыть файл server.cfg и дописать название плагина «mysql» (-plugins mysql);
    • Добавить файл » mysql.inc» в директорию: «/pawno/includes/», после чего дописать в начале мода » #include «

    • Linux:
    • Скачать плагин для серверов Linux;
    • Разместить » mysql.so» в папку с плагинами (/plugins/mysql.dll);
    • Открыть файл server.cfg и дописать название плагина «mysql» (-plugins mysql);
    • Добавить файл » mysql.inc» в директорию: «/pawno/includes/», после чего дописать в начале мода » #include «

    Скачать:

    Сообщение отредактировал Kuzmaaa: 07 Август 2014 — 01:38

    Mysqlnd_plugin_api

    There is no formal definition of what a plugin is and how a plugin mechanism works.

    Components often found in plugins mechanisms are:

    A plugin manager

    Application services (or modules)

    Application service APIs (or module APIs)

    The mysqlnd plugin concept employs these features, and additionally enjoys an open architecture.

    A plugin has full access to the inner workings of mysqlnd. There are no security limits or restrictions. Everything can be overwritten to implement friendly or hostile algorithms. It is recommended you only deploy plugins from a trusted source.

    As discussed previously, plugins can use pointers freely. These pointers are not restricted in any way, and can point into another plugin’s data. Simple offset arithmetic can be used to read another plugin’s data.

    It is recommended that you write cooperative plugins, and that you always call the parent method. The plugins should always cooperate with mysqlnd itself.


    Issues: an example of chaining and cooperation Extension mysqlnd.query() pointer call stack if calling parent 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

    In this scenario, a cache (ext/mysqlnd_cache) and a monitor (ext/mysqlnd_monitor) plugin are loaded. Both subclass Connection::query(). Plugin registration happens at MINIT using the logic shown previously. PHP calls extensions in alphabetical order by default. Plugins are not aware of each other and do not set extension dependencies.

    By default the plugins call the parent implementation of the query method in their derived version of the method.

    This is a recap of what happens when using an example plugin, ext/mysqlnd_plugin, which exposes the mysqlnd C plugin API to PHP:

    Any PHP MySQL application tries to establish a connection to 192.168.2.29

    The PHP application will either use ext/mysql, ext/mysqli or PDO_MYSQL. All three PHP MySQL extensions use mysqlnd to establish the connection to 192.168.2.29.

    Mysqlnd calls its connect method, which has been subclassed by ext/mysqlnd_plugin.

    ext/mysqlnd_plugin calls the userspace hook proxy::connect() registered by the user.

    The userspace hook changes the connection host IP from 192.168.2.29 to 127.0.0.1 and returns the connection established by parent::connect().

    ext/mysqlnd_plugin performs the equivalent of parent::connect(127.0.0.1) by calling the original mysqlnd method for establishing a connection.

    Whatever PHP MySQL extension had been used by the application, it receives a connection to 127.0.0.1. The PHP MySQL extension itself returns to the PHP application. The circle is closed.

    21.9.5.8. API MySQL Native Driver Plugin

    API MySQL Native Driver Plugin является функцией MySQL Native Driver, или mysqlnd . Mysqlnd плагины работают в уровне между приложениями PHP и сервером MySQL. Это сопоставимо с MySQL Proxy. MySQL Proxy управляет на уровне между любым клиентским приложением MySQL, например, приложением PHP и, сервер MySQL. Mysqlnd плагины могут предпринять типичные задачи MySQL Proxy, такие как выравнивание нагрузки, контроль и оптимизация производительности. Из-за различной архитектуры и расположения, mysqlnd у плагинов нет некоторых из недостатков Прокси MySQL. Например, с плагинами, нет никакой единственной точки отказа, никакой выделенный прокси-сервер, чтобы развернуться, и никакой новый язык программирования, чтобы учиться (Lua).

    A mysqlnd плагин может считаться расширением mysqlnd . Плагины могут прервать большинство mysqlnd функции. mysqlnd функции вызываются расширениями MySQL PHP такой как ext/mysql , ext/mysqli , и PDO_MYSQL . В результате это возможно для a mysqlnd плагин, чтобы прервать все вызовы, выполненные к этим расширениям из клиентского приложения.

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

    Mysqlnd плагины являются фактически Расширениями PHP, записанными в C, то использование mysqlnd сменный API (который встраивается в MySQL Native Driver, mysqlnd ). Плагины могут быть сделаны 100 %, прозрачными к приложениям PHP. Никакие изменения приложения не необходимы, потому что плагины работают на различном уровне. mysqlnd плагин может считаться работающий в уровне ниже mysqlnd .

    Следующий список представляет некоторые возможные приложения mysqlnd плагины.

    Разделение чтения-записи. Примером этого является PECL/mysqlnd_ms (Основное Ведомое устройство) расширение. Это расширение разделяет запросы чтения-записи для установки репликации.

    Круговой, наименее загруженный

    Контроль запроса. Примером этого является PECL/mysqlnd_sip (Защита Инжекции SQL) расширение. Это расширение осматривает запросы и выполняет только тех, которые разрешаются согласно ruleset.

    Кэширование. Примером этого является PECL/mysqlnd_qc (Кэш Запроса) расширение.

    Sharding. Примером этого является PECL/mysqlnd_mc (Много, Соединяются), расширение. Это расширение попытается разделить оператор SELECT на n-части, используя ИЗБРАННЫЙ. ОГРАНИЧЬТЕ part_1, ВЫБЕРИТЕ ПРЕДЕЛ part_n. Это отправляет запросы отличным серверам MySQL и объединяет результат в клиенте.

    MySQL Native Driver Plugins Available

    Есть много mysqlnd плагинов, уже доступных. Они включают:

    PECL/mysqlnd_mc — Много Соединяют плагин.

    PECL/mysqlnd_ms — Основной Ведомый плагин.

    PECL/mysqlnd_qc — плагин Кэша Запроса.

    PECL/mysqlnd_pscache — Готовый плагин Кэша описателей Оператора.

    PECL/mysqlnd_sip — плагин Защиты Инжекции SQL.

    PECL/mysqlnd_uh — Пользовательский плагин Обработчика.

    21.9.5.8.1. Сравнение mysqlnd плагинов с MySQL Proxy


    Mysqlnd плагины и MySQL Proxy являются различными технологиями, используя разные подходы. И допустимые инструменты для того, чтобы решить множество общих задач, таких как выравнивание нагрузки, контроль, и улучшения производительности. Важное различие — то, что MySQL Proxy работает со всеми клиентами MySQL, тогда как mysqlnd плагины являются определенными для приложений PHP.

    Как Расширение PHP, a mysqlnd плагин устанавливается на сервере приложений PHP, наряду с остальной частью PHP. MySQL Proxy может или быть выполнен на сервере приложений PHP или может быть установлен на выделенной машине, чтобы обработать многократные серверы приложений PHP.

    У развертывания MySQL Proxy на сервере приложений есть два преимущества:

    Никакая единственная точка отказа

    Легкий масштабировать (горизонтальный масштаб, масштабируйтесь клиентом),

    MySQL Proxy (и mysqlnd плагины), может решить проблемы легко, которые иначе потребовали бы изменений к существующим приложениям.

    Однако, у MySQL Proxy действительно есть некоторые недостатки:

    MySQL Proxy является новым компонентом и технологией ведущему устройству, и развернуться.

    MySQL Proxy требует знания языка сценариев Lua.

    MySQL Proxy может быть настроен с программированием C и Lua. Lua является привилегированным языком сценариев MySQL Proxy. Поскольку большинство экспертов PHP Луы является новым языком, чтобы учиться. A mysqlnd плагин может быть записан в C. Также возможно записать плагины в PHP, использующем PECL/mysqlnd_uh .

    MySQL Proxy работает как демон — фоновый процесс. MySQL Proxy может напомнить более ранние решения, поскольку все состояние может быть сохранено. Однако, a mysqlnd плагин связывается с основанным на запросе жизненным циклом PHP. MySQL Proxy может также совместно использовать одноразовые вычисленные результаты среди многократных серверов приложений. A mysqlnd плагин должен был бы хранить данные в персистентном носителе, чтобы быть в состоянии сделать это. Другой демон должен был бы использоваться с этой целью, такие как Memcache. Это дает MySQL Proxy преимущество в этом случае.

    MySQL Proxy работает сверху проводного протокола. С MySQL Proxy необходимо проанализировать и перепроектировать MySQL Client Server Protocol. Действия ограничиваются теми, которые могут быть достигнуты, управляя протоколом связи. Если проводной протокол изменяется (который происходит очень редко), сценарии MySQL Proxy должны были бы быть изменены также.

    Mysqlnd плагины работают сверху API C, который зеркально отражает libmysqlclient клиент и API Connector/C. Этот API C является в основном оберткой вокруг протокола MySQL Client Server, или проводного протокола, как это иногда вызывают. Можно прервать все вызовы API C. PHP использует API C, поэтому можно сцепить все вызовы PHP без потребности программировать на уровне проводного протокола.

    Mysqlnd реализует проводной протокол. Плагины могут поэтому проанализировать, перепроектировать, управлять и даже заменить протокол связи. Однако, это обычно не требуется.

    Поскольку плагины позволяют Вам создавать реализации, которые используют два уровня (C API и соединяют протокол проводом), у них есть большая гибкость чем MySQL Proxy. Если a mysqlnd плагин реализуется, используя API C, любые последующие изменения к проводному протоколу не требуют изменений к плагину непосредственно.

    21.9.5.8.2. Получение mysqlnd сменного API

    mysqlnd сменный API является просто частью расширения MySQL Native Driver PHP, ext/mysqlnd . Разработка, запущенная на mysqlnd сменный API в декабре 2009. Это разрабатывается, поскольку часть исходного репозитария PHP, и как таковой доступна общественности или через Мерзавца, или посредством исходных загрузок снимка.

    Следующая таблица показывает версии PHP и соответствие mysqlnd версия, содержавшая в пределах.

    Таблица 21.69. Связанная mysqlnd версия на выпуск PHP

    Версия PHP Версия MySQL Native Driver
    5.3.0 5.0.5
    5.3.1 5.0.5
    5.3.2 5.0.7
    5.3.3 5.0.7
    5.3.4 5.0.7

    Сменные разработчики могут определить mysqlnd версия посредством доступа MYSQLND_VERSION , который является строкой формата » mysqlnd 5.0.7-dev — 091210 — $Revision: 300535 » , или через MYSQLND_VERSION_ID , который является целым числом такой как 50007. Разработчики могут вычислить номер версии следующим образом:

    Таблица 21.70. Таблица вычисления MYSQLND_VERSION_ID

    Версия (часть)
    Пример
    Major*10000 5*10000 = 50000
    Minor*100 0*100 = 0
    Патч 7 = 7
    MYSQLND_VERSION_ID 50007

    Во время разработки разработчики должны обратиться к mysqlnd номер версии для совместимости и тестов версии, как несколько итераций mysqlnd мог произойти во время времени жизни ответвления разработки PHP с единственным номером версии PHP.

    21.9.5.8.3. MySQL Native Driver Plugin Architecture

    Этот раздел обеспечивает краткий обзор mysqlnd сменная архитектура.

    MySQL Native Driver Overview

    Перед разработкой mysqlnd плагины, полезно знать немногое как mysqlnd непосредственно организуется. Mysqlnd состоит из следующих модулей:

    Таблица 21.71. mysqlnd организационная схема, на модуль

    Статистика модулей mysqlnd_statistics.c
    Соединение mysqlnd.c
    Набор результатов mysqlnd_result.c
    Метаданные набора результатов mysqlnd_result_meta.c
    Оператор mysqlnd_ps.c
    Сеть mysqlnd_net.c
    Проводной протокол mysqlnd_wireprotocol.c

    C Объектно-ориентированная Парадигма


    На уровне кода, mysqlnd использует образец C для того, чтобы реализовать объектную ориентацию.

    В C Вы используете a struct представлять объект. Элементы struct представляют объектные свойства. Элементы Struct, указывающие на функции, представляют методы.

    В отличие от этого с другими языками, такими как C++ или Java, нет никаких закрепленных правил о наследовании в объектно-ориентированной парадигме C. Однако, есть некоторые соглашения, которые должны сопровождаться, который будет обсужден позже.

    Жизненный цикл PHP

    Рассматривая жизненный цикл PHP есть два основных цикла:

    Запуск механизма PHP и цикл завершения работы

    То, когда механизм PHP запустит это, вызовет инициализацию модуля (MINIT) функция каждого зарегистрированного расширения. Это позволяет каждому модулю устанавливать переменные и выделять ресурсы, которые будут существовать для времени жизни процесса механизма PHP. Когда механизм PHP завершит работу, он вызовет завершение работы модуля (MSHUTDOWN) функция каждого расширения.

    Во время времени жизни механизма PHP это получит много запросов. Каждый запрос составляет другой жизненный цикл. По каждому запросу механизм PHP вызовет функцию инициализации запроса каждого расширения. Расширение может выполнить любую переменную установку и распределение ресурсов, требуемое для обработки запросов. Поскольку цикл запроса заканчивает вызовы механизма завершение работы запроса (RSHUTDOWN) функция каждого расширения, таким образом, расширение может выполнить любую требуемую уборку.

    Как работает плагин

    A mysqlnd сменные работы, прерывая вызовы, выполненные к mysqlnd расширениями то использование mysqlnd . Это достигается, получая mysqlnd функциональная таблица, поддерживая это, и заменяя это пользовательской функциональной таблицей, которая вызывает функции плагина как требуется.

    Следующий код показывает как mysqlnd функциональная таблица заменяется:

    Табличные манипуляции функцией соединения должны быть сделаны во время Инициализации Модуля (MINIT). Функциональная таблица является глобальным совместно используемым ресурсом. В многопоточной среде, с TSRM создают, манипулирование глобальным совместно используемым ресурсом во время обработки запросов почти наверняка приведет к конфликтам.

    Не используйте логику фиксированного размера, управляя mysqlnd функциональная таблица: новые методы могут быть добавлены в конце функциональной таблицы. Функциональная таблица может измениться в любое время в будущем.

    Вызов родительских методов

    Если исходные функциональные записи таблицы поддерживаются, все еще возможно вызвать исходные функциональные записи таблицы — родительские методы.

    В некоторых случаях, такой что касается Connection::stmt_init() , жизненно важно вызвать родительский метод до любого другого действия в полученном методе.

    A mysqlnd объект представляется C struct. Не возможно добавить элемент к C struct во время выполнения. Пользователи mysqlnd объекты не могут просто добавить свойства к объектам.

    Произвольные данные (свойства) могут быть добавлены к a mysqlnd объекты используя соответствующую функцию mysqlnd_plugin_get_plugin_ _data() семейство. Выделяя объект mysqlnd резервы располагают с интервалами в конце объекта содержать a void * указатель на произвольные данные. mysqlnd резервы располагают с интервалами для одного void * указатель на плагин.

    Следующая таблица показывает, как вычислить позицию указателя для определенного плагина:

    Таблица 21.72. Вычисления указателя для mysqlnd

    Адрес памяти Содержание
    Начало mysqlnd возражает C struct
    n Конец mysqlnd возражает C struct
    n + (м. x sizeof (освобождают *)), void*, чтобы возразить данным м. th плагин

    Если Вы планируете разделить какой-либо на подклассы из mysqlnd возразите конструкторам, который позволяется, следует помнить это!

    Следующие выставочные свойства расширения кода:

    Сменный разработчик ответственен за управление сменной памятью данных.

    Использование mysqlnd средство выделения памяти рекомендуется для сменных данных. Эти функции называют, используя соглашение: mnd_*loc() . mysqlnd у средства выделения есть некоторые полезные функции, такие как возможность использовать средство выделения отладки в неотладочная сборка.

    Таблица 21.73. Когда и как разделить на подклассы

    Соединение (MYSQLND)
    MINIT Нет mysqlnd_conn_get_methods ()
    Набор результатов (MYSQLND_RES) MINIT или позже Да mysqlnd_result_get_methods () или объектная работа с таблицами функции метода
    Набор результатов Мета (MYSQLND_RES_METADATA) MINIT Нет mysqlnd_result_metadata_get_methods ()
    Оператор (MYSQLND_STMT) MINIT Нет mysqlnd_stmt_get_methods ()
    Сеть (MYSQLND_NET) MINIT или позже Да mysqlnd_net_get_methods () или объектная работа с таблицами функции метода
    Проводной протокол (MYSQLND_PROTOCOL) MINIT или позже Да mysqlnd_protocol_get_methods () или объектный метод функционируют tablemanipulation

    Не следует управлять функциональными таблицами в любое время позже чем MINIT, если он не позволяется согласно вышеупомянутой таблице.

    Некоторые классы содержат указатель на таблицу функции метода. Все экземпляры такого class совместно используют ту же самую функциональную таблицу. Чтобы избежать хаоса, в особенности в поточных средах, такими функциональными таблицами нужно только управлять во время MINIT.

    Другие классы используют копии глобально совместно используемой функциональной таблицы. Табличная копия функции class создается вместе с объектом. Каждый объект использует свою собственную функциональную таблицу. Это дает Вам две опции: можно управлять таблицей функции значения по умолчанию объекта в MINIT, и можно дополнительно совершенствовать методы объекта, не воздействуя на другие экземпляры того же самого class.

    Преимущество совместно используемого функционального табличного подхода является производительностью. Нет никакой потребности скопировать функциональную таблицу для каждого объекта.

    Таблица 21.74. Состояние конструктора

    Как в MySQL 8.0 поменять значение глобальной переменной default_authentication_plugin?

    При переносе базы с сервера MySQL 5.7 на сервер MySQL 8.0 возникла проблема подключения пользователей (созданных заново на сервере MySQL 8.0) к базе:
    ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded: /usr/lib/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
    Прочитал, что нужно установить значение переменной default_authentication_plugin в mysql_native_password.
    Я прописал в my.ini:
    [mysqld]
    default-authentication-plugin=mysql_native_password
    [mysql]
    default-authentication-plugin=mysql_native_password.
    Затем рестартанул сервер. Но значение переменной не изменилось:

    Как же все-таки установить переменную default_authentication_plugin в mysql_native_password и решить проблему с аутентификацией пользователей?
    ps. Много где пишут не про переменную, а про опцию ––default-authentication-plugin. Что это и как изменить значение опции? Это то же самое, что и переменная?
    pps. В консоли изменить значение переменной тоже не удается:

    Mysqlnd_plugin_api

    The plugin implementation comprises several components.

    INSTALL PLUGIN registers a plugin in the plugin table and loads the plugin code.

    UNINSTALL PLUGIN unregisters a plugin from the plugin table and unloads the plugin code.

    The WITH PARSER clause for full-text index creation associates a full-text parser plugin with a given FULLTEXT index.

    SHOW PLUGINS displays information about server plugins.

    Command-line options and system variables:

    The —plugin-load option enables plugins to be loaded at server startup time.

    The plugin_dir system variable indicates the location of the directory where all plugins must be installed. The value of this variable can be specified at server startup with a —plugin_dir= path option. mysql_config —plugindir displays the default plugin directory path name.

    Source files (the locations indicate where the files are found in a MySQL source distribution):

    In the include/mysql directory, plugin.h exposes the public plugin API. This file should be examined by anyone who wants to write a plugin library. plugin_ xxx .h files provide additional information that pertains to specific types of plugins.

    Илон Маск рекомендует:  noframes в HTML
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL