CakeFest 2024: The Official CakePHP Conference

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

Этот раздел посвящён описанию инструментов для взаимодействия 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 и драйвер PDO MySQL, взаимодействуют с ядром с помощью фреймворка PHP модулей.

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

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

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

Какие инструменты для работы с MySQL предлагает API PHP?

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

  • Модуль PHP mysqli

  • Объекты данных PHP (PDO)

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

Что такое PHP-модуль mysqli?

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

mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:

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

  • Поддержка подготавливаемых запросов

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

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

  • Улучшенные возможности отладки

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

модуль 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, модуль mysqli и драйвер PDO MYSQL используют низкоуровневую библиотеку, в которой реализованы необходимые протоколы. В прошлом была доступна только одна такая библиотека: Клиентская библиотека MySQL (MySQL Client Library), также известная как libmysqlclient.

Однако, интерфейс, который предоставляла libmysqlclient, не был оптимизирован для взаимодействия с PHP-приложениями, так как изначально libmysqlclient разрабатывалась для работы с С-приложениями. Несколько позже был разработан нативный драйвер MySQL (MySQL Native Driver) mysqlnd, который представляет собой альтернативу libmysqlclient для PHP.

И модуль mysqli и драйвер PDO MySQL можно индивидуально настроить для работы либо с libmysqlclient, либо с mysqlnd. Так как mysqlnd создавался специально для PHP-систем, у него есть преимущество в скорости и расходах памяти перед libmysqlclient. Поэтому его использование предпочтительней.

Нативный драйвер MYSQL собирается при помощи фреймворка модулей PHP, его исходный код расположен в директории ext/mysqlnd. Он не предоставляет API-интерфейс программисту PHP.

Сравнение возможностей

В приведённой таблице приводится сравнение функционала основных методов подключения к MySQL из PHP:

Сравнение опций MySQL API в PHP
  Модуль PHP mysqli PDO (используя драйвер PDO MySQL и нативный драйвер MySQL)
Версия PHP, в которой был внедрён функционал 5.0 5.0
Статус разработки MySQL Разработка продолжается Разработка продолжается
API поддерживает наборы символов Да Да
API поддерживает подготавливаемые запросы на стороне сервера Да Да
API поддерживает подготавливаемые запросы на стороне клиента Нет Да
API поддерживает хранимые процедуры Да Да
API поддерживает множественные запросы Да По большей части
Поддержка всего функционала MySQL 4.1+ Да По большей части
add a note

User Contributed Notes 2 notes

up
27
guatebus at dot gmail dot com
10 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
-1
php-includer at gmail dot com
9 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.
To Top