Этот раздел посвящен описанию инструментов для взаимодействия PHP-приложений с базами данных MySQL.
Что такое API?
Интерфейс программирования приложений, или API, определяет набор классов, методов, функций и переменных, которые можно вызывать из вашего приложения для выполнения поставленных задач. Применительно к PHP приложениям, которые должны взаимодействовать с базами данных, необходимые для этого API, как правило, представлены PHP-расширениями.
API могут быть процедурными или объектно-ориентированными. При использовании процедурных API вы вызываете функции для выполнения каких-либо операций, а в случае объектно-ориентированных вы инстанцируете классы и затем вызываете методы созданных объектов. Второй подход, обычно, предпочтительнее, так как он более современный и способствует написанию более организованного кода.
API MySQL предоставляет несколько способов подключения к базе данных из PHP-приложения. В этом документе приводится описание этих способов и даются рекомендации, как выбрать наиболее подходящее решение в конкретной ситуации.
Что такое коннектор?
В документации MySQL термин коннектор (connector) относится к части программного обеспечения, отвечающей за подключение к серверу MySQL. MySQL предоставляет множество коннекторов для различных языков программирования, в частности для PHP.
Для обеспечения взаимодействия PHP приложения с сервером баз данных вам необходимо написать PHP код, выполняющий подключение к серверу, выполнение запросов к базе данных и тому подобные операции. От программного обеспечения сервера требуется предоставить API, которое ваше PHP-приложение сможет использовать, а также функционал, ответственный за взаимодействие вашего приложения с сервером. Программное обеспечение, реализующее такой функционал, обычно называют коннектором, так как оно позволяет вашему приложению подключиться (to connect) к серверу баз данных. В ряде случаев коннектор для своих нужд может потребовать дополнительные библиотеки.
Что такое драйвер?
Драйвером называется часть программного обеспечения, отвечающая за взаимодействие приложения с конкретным типом серверов баз данных. Драйвер также может обращаться к внешним библиотекам, таким как клиентская библиотека MySQL или нативный драйвер MySQL. Эти библиотеки реализуют низкоуровневый протокол взаимодействия с сервером MySQL.
В качестве примера можно привести уровень абстракции для работы с базами данных Объекты данных PHP (PDO), который может использовать один из нескольких драйверов, специфичных для конкретных баз данных. В качестве такого драйвера может выступать драйвер PDO MYSQL, который позволяет PDO взаимодействовать с MySQL-сервером.
Иногда люди употребляют термины коннектор и драйвер, как синонимы, и это
может сбить с толку. В документации MySQL термин драйвер
означает участок программного кода, входящий в состав коннектора и отвечающий
за связь с конкретной СУБД.
Что такое расширение?
В документации к PHP вы будете неоднократно сталкиваться с термином расширение. Код PHP как такового состоит из ядра и присоединенных к нему необязательных расширений, которые увеличивают круг задач, которые может выполнять ядро. Относящиеся к MySQL расширения, такие как mysqli и mysql, взаимодействуют с ядром с помощью фреймворка PHP расширений.
Обычно расширения предоставляют свой API-интерфейс PHP-программисту, чтобы тот мог программно использовать возможности расширения. Однако, некоторые расширения, использующие фреймворк PHP-расширений, не предоставляют программистам никаких интерфейсов.
Драйвер PDO MySQL, например, не предоставляет своего API. Он предоставляет интерфейс только абстрактному слою PDO, лежащему выше.
Термины API и расширение нельзя воспринимать как синонимы, так как расширение может и не предоставлять API программисту.
Какие инструменты для работы с MySQL предлагает API PHP?
API предоставляет на выбор три набора инструментов для подключения к серверу баз данных MySQL:
Расширение PHP MySQL
Расширение PHP mysqli
Объекты данных PHP (PDO)
Каждый из них имеет свои достоинства и недостатки. Целью данного обзора является краткое описание ключевых особенностей каждого API.
Что такое расширение PHP MySQL?
Это оригинальное расширение позволяет разрабатывать PHP-приложения, которые могут взаимодействовать с базой данных MySQL. Расширение mysql предоставляет процедурный интерфейс и предназначено для использования с MySQL версии 4.1.3 или более ранними версиями. Его также можно использовать и с более свежими версиями СУБД, но в этом случае многие возможности сервера, появившиеся после версии 4.1.3, будут недоступны программисту.
Замечание:
Если вы работаете с сервером MySQL 4.1.3 или более поздних версий, настоятельно рекомендуется использовать расширение mysqli.
Исходные коды расширения mysql расположены в директории расширений PHP ext/mysql.
Дополнительную информацию о расширении mysql можно почерпнуть из ресурса MySQL (Original).
Что такое PHP-расширение mysqli?
Расширение mysqli, или как его еще называют улучшенное (improved) расширение MySQL, было разработано, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL-сервера версий 4.1.3 и выше. Расширение mysqli включается в поставку PHP версий 5 и выше.
mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:
Объектно-ориентированный интерфейс
Поддержка подготавливаемых запросов
Поддержка мультизапросов
Поддержка транзакций
Улучшенные возможности отладки
Поддержка встроенного сервера
Замечание:
При работе с MySQL версий 4.1.3 и выше настоятельно рекомендуется использовать именно это расширение.
Наравне с объектно-ориентированным расширение предоставляет и процедурный интерфейс.
Расширение mysqli собирается при помощи фреймворка расширений PHP, его исходный код расположен в директории ext/mysqli.
За дополнительной информацией о расширении mysqli, обращайтесь к разделу MySQLi.
Что такое PDO?
Объекты данных PHP, или PDO, представляют из себя абстракцию коннектора баз данных для PHP приложений. PDO предоставляет API интерфейс взаимодействия с базой данных, не зависящий от конкретной СУБД. Теоретически, при использовании PDO можно поменять сервер баз данных, например с Firebird на MySQL, и это приведет лишь к незначительным изменениям в PHP-коде.
В качестве других подобных абстракций можно привести JDBC для Java-приложений и DBI для Perl.
Наряду с преимуществами PDO, такими как простота и переносимость API, есть его главный недостаток: PDO поддерживает не все возможности сервера баз данных, доступные в последних версиях MySQL. Например, средствами PDO нельзя создавать множественные запросы, хотя MySQL их и поддерживает.
PDO собирается при помощи фреймворка расширений PHP, его исходный код расположен в директории ext/pdo.
Дополнительную информацию о PDO см. в разделе PDO.
Что такое драйвер PDO MYSQL?
Драйвер PDO MYSQL не является API как таковым, во всяком случае с точки зрения программиста. Драйвер PDO MYSQL располагается между самим PDO и сервером MySQL. Программист вызывает функции интерфейса API PDO, а PDO в свою очередь использует драйвер PDO MYSQL для обмена данными и командами с сервером MySQL.
Драйвер PDO MYSQL лишь один из многих PDO-драйверов. Для большинства СУБД есть свои PDO драйверы, как например драйверы для Firebird или PostgreSQL серверов.
Драйвер PDO MYSQL собирается при помощи фреймворка расширений PHP, его исходный код расположен в директории ext/pdo_mysql. Он не предоставляет API-интерфейс программисту PHP.
Дополнительно о драйвере PDO MYSQL можно прочитать в разделе MySQL (PDO).
Что такое нативный драйвер MySQL для PHP?
Чтобы обеспечить взаимодействие с сервером MySQL, расширения mysql и mysqli, а также драйвер PDO MYSQL используют низкоуровневую библиотеку, в которой реализованы необходимые протоколы. В прошлом была доступна только одна такая библиотека: Клиентская библиотека MySQL (MySQL Client Library), также известная как libmysqlclient.
Однако, интерфейс, который предоставляла libmysqlclient, не был оптимизирован для взаимодействия с PHP-приложениями, так как изначально libmysqlclient разрабатывалась для работы с С-приложениями. Несколько позже был разработан нативный драйвер MySQL (MySQL Native Driver) mysqlnd, который представляет собой альтернативу libmysqlclient для PHP.
Каждое из расширений mysql или mysqli, а также драйвер PDO MySQL можно индивидуально настроить для работы либо с libmysqlclient, либо с mysqlnd. Так как mysqlnd создавался специально для PHP-систем, у него есть преимущество в скорости и расходах памяти перед libmysqlclient. Поэтому его использование предпочтительней.
Замечание:
Нативный драйвер MySQL может использоваться только с MySQL версии 4.1.3 и выше.
Нативный драйвер MYSQL собирается при помощи фреймворка расширений PHP, его исходный код расположен в директории ext/mysqlnd. Он не предоставляет API-интерфейс программисту PHP.
Сравнение возможностей
В приведенной таблице приводится сравнение функционала трех основных методов подключения к MySQL из PHP:
Расширение PHP mysqli | PDO (используя драйвер PDO MySQL и нативный драйвер MySQL) | Расширение PHP MySQL | |
---|---|---|---|
Версия PHP, в которой был внедрен функционал | 5.0 | 5.0 | До 3.0 |
Включено в PHP 5.x | Да | Да | Да |
Статус разработки MySQL | Разработка продолжается | Разработка продолжается по состоянию на PHP 5.3 | Только поддержка |
Рекомендовано MySQL для разработки новых проектов | Да - отдается предпочтение | Да | Нет |
API поддерживает наборы символов | Да | Да | Нет |
API поддерживает подготавливаемые запросы на стороне сервера | Да | Да | Нет |
API поддерживает подготавливаемые запросы на стороне клиента | Нет | Да | Нет |
API поддерживает хранимые процедуры | Да | Да | Нет |
API поддерживает множественные запросы | Да | По большей части | Нет |
Поддержка всего функционала MySQL 4.1+ | Да | По большей части | Нет |