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

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

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. Программист вызывает функции интерфейса PDO API, а 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+ Да По большей части Нет
add a note add a note

User Contributed Notes 3 notes

up
23
guatebus at dot gmail dot com
4 years ago
The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.

Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
up
9
php-includer at gmail dot com
3 years ago
mysqli can be great in some circumstances but much work has been put into PHP Portable Data Objects (PDO) which you should also consider when choosing a way to connect to your database using php. For example, PDO supports MySQL with minimal performance hit and the code your write for it will support many other databases with little or no changes. That said, the database connection code, even if you have to change a lot of it to use another database will be much less work than coding your actual database data entry and report apps. When I started creating PHP/MySQL apps years ago, I used php's native support for PHP then moved to PEAR:DB and MDB/MDB2 and finally to wizzyweb which is basically like "phpMyAdmin for Apps" to create apps as it automatically generates the PHP PDO connection code and the application code. Sure, I could code it all from scratch but I save about 90% of the time it used to take. The point is look at the total amount of time you will save by using native code vs. an abstraction layer. Most people find that programmer time is the most valuable part of the equation so anything than can save programmer time should be heavily weighted.
up
-17
Nuruddeen Mu'azu (Dr. Annoor Bauchi)
1 year ago
I strongly recommend PHP programmers to use PDO as there drivers
To Top