# Краткий обзор

Раздел описывает инструменты, которые помогают программистам разрабатывать PHP-приложения, которые взаимодействуют с базой данных MySQL.

Об API-интерфейсе

Программный интерфейс приложения (англ. Application Programming Interface, API) определяет набор классов, методов, функций и переменных, к которым приложению потребуется обращаться, чтобы выполнить поставленные задачи. PHP-приложения взаимодействуют с базами данных через API-интерфейсы, которые приложениям обычно открывают PHP-модули.

Программисты взаимодействуют с модулями через процедурный или объектно-ориентированный API-интерфейс. При работе через процедурный API задачи выполняют путём вызова функций, при взаимодействии через объектно-ориентированный API-интерфейс создают экземпляры классов, а затем вызывают методы этих объектов. Из этих двух интерфейсов часто выбирают последний, поскольку код в объектно-ориентированном стиле лучше организован, что снижает сложность восприятия кода и упрощает тестирование и поддержку.

Язык программирования PHP предлагает разработчикам несколько API-интерфейсов, через которые PHP-приложения взаимодействуют с базами данных MySQL. Документ описывает эти интерфейсы и даёт рекомендации по выбору конкретного способа подключения к базе данных из приложения.

О коннекторе

В MySQL-документации термин коннектор (англ. connector) относится к части программного обеспечения, которая разрешает приложению подключаться к серверу баз данных MySQL. БД MySQL предоставляет коннекторы для разных языков программирования, включая язык PHP.

Разработчику потребуется написать PHP-код, чтобы PHP-приложение научилось взаимодействовать с сервером баз данных: подключаться, отправлять запросы и выполнять другие операции, которые связаны с базой данных. Серверу баз данных потребуется ПО, чтобы предоставить API-интерфейс, через который PHP-приложение будет взаимодействовать с сервером, и чтобы управлять обменом информацией между приложением и сервером баз данных, для чего иногда также требуются промежуточные библиотеки. Это программное обеспечение называется коннектором, поскольку разрешает приложению подключаться (англ. to connect) к серверу баз данных.

О драйвере

Драйвер — часть программного обеспечения, которую разработали для взаимодействия приложения с конкретным типом сервера баз данных. Приложение вызывает методы коннектора, тот обращается к своему драйверу конкретной СУБД, а драйвер со своей стороны обращается к нижележащим библиотекам — клиентской библиотеке MySQL Client Library или встроенному драйверу MySQL Native Driver. Эти библиотеки реализуют низкоуровневый протокол взаимодействия с MySQL-сервером баз данных.

Например, PHP-модуль PDO, который поддерживает доступ к базам данных на уровне абстракции, содержит набор драйверов для доступа к конкретным базам данных. В список доступных модулю драйверов входит драйвер PDO_MYSQL, который разрешает модулю PDO взаимодействовать с сервером MySQL.

Термины «коннектор» и «драйвер» иногда употребляют как синонимы, это сбивает с толку. В MySQL-документации термин драйвер зарезервировали за программным обеспечением, которое предоставляет часть пакета коннектора для конкретной базы данных.

О модуле

В PHP-документации встречается ещё один термин — модуль. Код самого PHP состоит из ядра и дополнительных модулей, которые расширяют функциональность ядра. Для работы с СУБД MySQL ядро PHP расширили модулем `mysqli` и модулем PDO с MySQL-драйвером. Оба модуля включили в инфраструктуру модулей языка PHP.

Обычно модули предоставляют PHP-программисту API-интерфейс, через который разработчик получает доступ к функциям модуля программно. При этом отдельные модули в инфраструктуре PHP-модулей не раскрывают для программиста никаких интерфейсов.

MySQL-драйвер модуля PDO, например, не раскрывает API-интерфейс для программиста, но предоставляет интерфейс вышележащему абстрактному слою, который представляет модуль PDO.

Термины «API-интерфейс» и «модуль» нельзя воспринимать как одно и то же, поскольку модуль не обязан раскрывать API-интерфейс для программиста.

О главных API-интерфейсах языка PHP для работы с БД MySQL

PHP предлагает два API-интерфейса для подключения к серверу баз данных MySQL:

- PHP-модуль mysqli

- PHP-модуль PDO

Каждый модуль содержит достоинства, но встречаются и недостатки. Цель следующей части обзора состоит в кратком описании характеристик каждого API-интерфейса.

О PHP-модуле mysqli

Модуль `mysqli`, или улучшенный модуль MySQL (англ. improved MySQL), разработали, чтобы PHP-программисты получили выгоду, которую дают новые функции MySQL-систем версии 4.1.3 и выше. Модуль `mysqli` включается в пакет PHP версии 5 и выше.

Модуль `mysqli` содержит преимущества, главные из которых по сравнению с модулем `mysql` состоят в следующем:

- Объектно-ориентированный интерфейс

- Поддержка подготовленных запросов

- Поддержка мультизапросов

- Поддержка транзакций

- Расширенные инструменты отладки

Наравне с объектно-ориентированным интерфейсом модуль предоставляет и процедурный интерфейс.

Модуль `mysqli` встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в каталоге ext/mysqli.

Подробнее о модуле `mysqli` рассказывает раздел MySQLi.

О модуле PDO

Модуль PDO — абстракция коннектора, которая определяет интерфейс доступа к базам данных для PHP-приложений. Модуль PDO раскрывает для PHP-приложений согласованный API-интерфейс, при взаимодействии с которым приложение не зависит от типа конкретного сервера баз данных, к которому подключается. Теоретически, при работе через API-интерфейс модуля PDO один сервер баз данных легко заменить другим, например поменять Firebird на MySQL, и для этого потребуются внести в PHP-код только незначительные изменения.

К другим примерам абстракций коннекторов баз данных относятся пакет JDBC для Java-приложений и пакет DBI для приложений на языке программирования Perl.

Преимущества модуля PDO состоят в чистоте, простоте и переносимости API-интерфейса, а главный недостаток модуля — недоступность продвинутых функций, которые поддерживаются последними версиями MySQL-сервера. К таким функциям, например, относятся множественные запросы, которые модуль PDO не поддерживает.

Модуль PDO встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в директории ext/pdo.

Подробнее о модуле рассказывает раздел PDO.

О драйвере модуля PDO для работы с СУБД MySQL

MySQL-драйвер модуля PDO не относится к API-интерфейсу, который модуль раскрывает для программиста. MySQL-драйвер модуля PDO лежит на уровне ниже самого модуля PDO и взаимодействует с MySQL-сервером. Программист вызывает функции API-интерфейса модуля PDO, а модуль взаимодействует с драйвером для отправки данных и команд на MySQL-сервер.

MySQL-драйвер модуля PDO взаимодействует с MySQL-серверами, но модуль также включает драйверы для взаимодействия с серверами баз данных Firebird, PostgreSQL и другими СУБД.

MySQL-драйвер модуля PDO встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в каталоге ext/pdo_mysql. Модуль не раскрывает API-интерфейс PHP-программисту.

Дополнительно о MySQL-драйвере модуля PDO рассказывает раздел PDO-драйвер СУБД MySQL.

О родном драйвере PHP для работы с СУБД MySQL

Модуль `mysqli` и MySQL-драйвер модуля PDO взаимодействуют с MySQL-сервером путём обращения к низкоуровневой библиотеке, которая реализует протокол взаимодействия с СУБД. Раньше единственной доступной библиотекой была клиентская библиотека MySQL Client Library, которая распространяется как пакет `libmysqlclient`.

Однако интерфейс, который предоставляла библиотека `libmysqlclient`, не был оптимизирован для взаимодействия с PHP-приложениями, поскольку библиотека `libmysqlclient` разрабатывалась для работы с приложениями на языке C. Поэтому как альтернативу MySQL-библиотеке `libmysqlclient` разработали родной PHP-драйвер для взаимодействия с СУБД MySQL — MySQL Native Driver, который распространяется как PHP-модуль и называется `mysqlnd`.

Модуль `mysqli` и PDO-драйвер для СУБД MySQL настраиваются отдельно — либо для работы с внешней библиотекой `libmysqlclient`, либо для работы с родным PHP-драйвером `mysqlnd`. Внутренний драйвер работает быстрее и расходует меньше памяти по сравнению с внешней библиотекой `libmysqlclient`, поскольку драйвер `mysqlnd` разработали непосредственно для работы в PHP-системах. Поэтому лучше предпочесть родной PHP-драйвер.

Родной PHP-драйвер для взаимодействия с СУБД MySQL встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в каталоге ext/mysqlnd. Модуль не раскрывает API-интерфейс для PHP-программиста.

Сравнение функций модулей

Следующая таблица сравнивает функциональность основных методов подключения к СУБД MySQL из PHP-приложения:

Сравнение API-интерфейсов для взаимодействия PHP-приложений с СУБД MySQL
| PHP-модуль mysqli | PHP-модуль PDO через драйвер PDO_MySQL и родной PHP-драйвер для СУБД MySQL
--- | --- | ---
Версия PHP, в которой представили модуль | 5.0 | 5.0
Статус разработки MySQL | Разработка продолжается | Разработка продолжается
API поддерживает наборы символов | Да | Да
API поддерживает подготовленные запросы на стороне сервера | Да | Да
API поддерживает подготавливаемые запросы на стороне клиента | Нет | Да
API поддерживает хранимые процедуры | Да | Да
API поддерживает множественные запросы | Да | По большей части
Поддержка всего функционала MySQL 4.1+ | Да | По большей части

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open