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

Этот раздел посвящен описанию инструментов для взаимодействия 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:

Сравнение опций MySQL API в 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+ Да По большей части Нет