mirror of
https://github.com/php/doc-ru.git
synced 2026-03-24 07:42:22 +01:00
480 lines
22 KiB
XML
480 lines
22 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 7cff4d34f0324c9de72d15957e1b62e20f37dfaf Maintainer: rjhdby Status: ready -->
|
||
<!-- Reviewed: no --><set xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="set.mysqlinfo">
|
||
<title>Драйверы и плагины MySQL</title>
|
||
<titleabbrev>MySQL</titleabbrev>
|
||
|
||
<info xml:id="mysqlinfo.info">
|
||
<abstract>
|
||
<simpara>
|
||
PHP предлагает ряд драйверов и MySQL-плагинов для доступа и работы с СУБД MySQL.
|
||
</simpara>
|
||
<simpara>
|
||
Раздел описывает различия и функциональность MySQL-модулей.
|
||
</simpara>
|
||
<simpara>
|
||
Модули, которые перечисляет раздел, поддерживают MySQL-протокол.
|
||
Примеры совместимых серверов баз данных:
|
||
<link xlink:href="&url.mariadb;">MariaDB Server</link>,
|
||
<link xlink:href="&url.mysql;">MySQL Server</link>,
|
||
<link xlink:href="&url.perconaserver;">Percona Server for MySQL</link>
|
||
и
|
||
<link xlink:href="&url.tidb;">TiDB</link>.
|
||
</simpara>
|
||
</abstract>
|
||
</info>
|
||
|
||
<book xml:id="mysql">
|
||
<title>Обзор PHP-драйверов MySQL</title>
|
||
|
||
<preface xml:id="mysqlinfo.intro">
|
||
<title>Введение</title>
|
||
<simpara>
|
||
Доступ к базе данных MySQL получают через набор API-интерфейсов языка PHP.
|
||
Пользователи выбирают между модулями
|
||
<link linkend="book.mysqli">mysqli</link>
|
||
или <link linkend="ref.pdo-mysql">PDO_MySQL</link>.
|
||
</simpara>
|
||
<simpara>
|
||
Это краткое руководство объясняет
|
||
<link linkend="mysqlinfo.terminology">терминологию</link>, которая описывает
|
||
каждый API, даёт информацию
|
||
<link linkend="mysqlinfo.api.choosing">о выборе API</link>
|
||
и информацию, которая помогает в выборе
|
||
<link linkend="mysqlinfo.library.choosing">библиотеки</link> MySQL
|
||
для работы с API.
|
||
</simpara>
|
||
</preface>
|
||
|
||
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.terminology">
|
||
<title>Обзор терминологии</title>
|
||
<simpara>
|
||
Раздел описывает инструменты, которые помогают программистам разрабатывать PHP-приложения,
|
||
которые взаимодействуют с базой данных MySQL.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
<emphasis role="bold">Об API-интерфейсе</emphasis>
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Программный интерфейс приложения (англ. Application Programming Interface, API)
|
||
определяет набор классов, методов, функций и переменных, к которым приложению потребуется обращаться,
|
||
чтобы выполнить поставленные задачи. PHP-приложения взаимодействуют с базами данных через API-интерфейсы,
|
||
которые приложениям обычно открывают PHP-модули.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Программисты взаимодействуют с модулями через процедурный или объектно-ориентированный API-интерфейс.
|
||
При работе через процедурный API задачи выполняют путём вызова функций,
|
||
при взаимодействии через объектно-ориентированный API-интерфейс создают экземпляры классов,
|
||
а затем вызывают методы этих объектов. Из этих двух интерфейсов часто выбирают последний,
|
||
поскольку код в объектно-ориентированном стиле лучше организован, что снижает сложность
|
||
восприятия кода и упрощает тестирование и поддержку.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Язык программирования PHP предлагает разработчикам несколько API-интерфейсов,
|
||
через которые PHP-приложения взаимодействуют с базами данных MySQL.
|
||
Документ описывает эти интерфейсы и даёт рекомендации
|
||
по выбору конкретного способа подключения к базе данных из приложения.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
<emphasis role="bold">О коннекторе</emphasis>
|
||
</simpara>
|
||
|
||
<simpara>
|
||
В MySQL-документации термин <emphasis>коннектор</emphasis> (англ. connector) относится
|
||
к части программного обеспечения, которая разрешает приложению подключаться к серверу баз данных MySQL.
|
||
БД MySQL предоставляет коннекторы для разных языков
|
||
программирования, включая язык PHP.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Разработчику потребуется написать PHP-код, чтобы PHP-приложение научилось взаимодействовать
|
||
с сервером баз данных: подключаться, отправлять запросы
|
||
и выполнять другие операции, которые связаны с базой данных.
|
||
Серверу баз данных потребуется ПО, чтобы предоставить API-интерфейс,
|
||
через который PHP-приложение будет взаимодействовать с сервером,
|
||
и чтобы управлять обменом информацией между приложением и сервером баз данных,
|
||
для чего иногда также требуются промежуточные библиотеки.
|
||
Это программное обеспечение называется коннектором, поскольку разрешает приложению
|
||
<emphasis>подключаться</emphasis> (англ. to connect) к серверу баз данных.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
<emphasis role="bold">О драйвере</emphasis>
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Драйвер — часть программного обеспечения, которую разработали
|
||
для взаимодействия приложения с конкретным типом сервера баз данных.
|
||
Приложение вызывает методы коннектора, тот обращается к своему драйверу конкретной СУБД,
|
||
а драйвер со своей стороны обращается к нижележащим библиотекам —
|
||
клиентской библиотеке MySQL Client Library или встроенному драйверу MySQL Native Driver.
|
||
Эти библиотеки реализуют низкоуровневый протокол взаимодействия с MySQL-сервером баз данных.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Например, PHP-модуль <link linkend="mysqli.overview.pdo">PDO</link>, который поддерживает доступ
|
||
к базам данных на уровне абстракции, содержит набор драйверов для доступа к конкретным базам данных.
|
||
В список доступных модулю драйверов входит драйвер PDO_MYSQL,
|
||
который разрешает модулю PDO взаимодействовать с сервером MySQL.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Термины «коннектор» и «драйвер» иногда употребляют как синонимы,
|
||
это сбивает с толку. В MySQL-документации термин <quote>драйвер</quote>
|
||
зарезервировали за программным обеспечением, которое предоставляет
|
||
часть пакета коннектора для конкретной базы данных.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
<emphasis role="bold">О модуле</emphasis>
|
||
</simpara>
|
||
|
||
<simpara>
|
||
В PHP-документации встречается ещё один термин — <emphasis>модуль</emphasis>.
|
||
Код самого PHP состоит из ядра и дополнительных модулей, которые расширяют
|
||
функциональность ядра. Для работы с СУБД MySQL ядро PHP расширили модулем
|
||
<literal>mysqli</literal> и модулем PDO с MySQL-драйвером. Оба модуля включили
|
||
в инфраструктуру модулей языка PHP.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Обычно модули предоставляют PHP-программисту API-интерфейс,
|
||
через который разработчик получает доступ к функциям модуля программно.
|
||
При этом отдельные модули в инфраструктуре PHP-модулей не раскрывают для программиста никаких интерфейсов.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
MySQL-драйвер модуля PDO, например, не раскрывает API-интерфейс для программиста,
|
||
но предоставляет интерфейс вышележащему абстрактному слою, который представляет модуль PDO.
|
||
</simpara>
|
||
|
||
<simpara>
|
||
Термины «API-интерфейс» и «модуль» нельзя воспринимать как одно и то же,
|
||
поскольку модуль не обязан раскрывать API-интерфейс для программиста.
|
||
</simpara>
|
||
</chapter>
|
||
|
||
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.api.choosing">
|
||
<title>Выбор API-интерфейса</title>
|
||
<simpara>
|
||
PHP предлагает разные API-интерфейсы для доступа к СУБД MySQL.
|
||
Примеры в следующем абзаце показывают взаимодействие с API-интерфейсом модулей mysqli и PDO.
|
||
Каждый фрагмент кода создаёт соединение с MySQL-сервером,
|
||
который работает на домене example.com. Код передаёт значение "user" как имя пользователя,
|
||
а значение "password" как пароль.
|
||
</simpara>
|
||
<example>
|
||
<title>Сравнение API-интерфейсов для взаимодействия с СУБД MySQL</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
// mysqli
|
||
$mysqli = new mysqli("example.com", "user", "password", "database");
|
||
$result = $mysqli->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
|
||
$row = $result->fetch_assoc();
|
||
echo htmlentities($row['_message']);
|
||
|
||
// PDO
|
||
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
|
||
$statement = $pdo->query("SELECT 'Привет, дорогой пользователь MySQL!' AS _message FROM DUAL");
|
||
$row = $statement->fetch(PDO::FETCH_ASSOC);
|
||
echo htmlentities($row['_message']);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example>
|
||
<title>Сравнение подготовленных запросов</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
// Модуль mysqli
|
||
$mysqli = new mysqli("example.com", "user", "password", "database");
|
||
$statement = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
|
||
$statement->execute(["Amersfoort"]);
|
||
$result = $statement->get_result();
|
||
$row = $result->fetch_assoc();
|
||
echo htmlentities($row['District']);
|
||
|
||
// Модуль PDO
|
||
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
|
||
$statement = $pdo->prepare("SELECT District FROM City WHERE Name=?");
|
||
$statement->execute(["Amersfoort"]);
|
||
$row = $statement->fetch(PDO::FETCH_ASSOC);
|
||
echo htmlentities($row['District']);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<simpara>
|
||
<emphasis role="bold">Сравнение функций модулей</emphasis>
|
||
</simpara>
|
||
<simpara>
|
||
Общая производительность обоих модулей примерно одинакова.
|
||
Хотя производительность модуля составляет только часть общего времени
|
||
выполнения веб-запроса PHP. Часто влияние составляет не более 0,1 %.
|
||
</simpara>
|
||
<informaltable xml:id="mysqlinfo.api.choosing.changelog">
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry/>
|
||
<entry>ext/mysqli</entry>
|
||
<entry>PDO_MySQL</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
<row>
|
||
<entry>Версия PHP, в которой представили модуль</entry>
|
||
<entry>5.0</entry>
|
||
<entry>5.1</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Входит в состав PHP 7.x и 8.x</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Статус разработки</entry>
|
||
<entry>Активный</entry>
|
||
<entry>Активный</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Жизненный цикл</entry>
|
||
<entry>Активный</entry>
|
||
<entry>Активный</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Рекомендуется для новых проектов</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Предлагает ООП-интерфейс</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Предлагает процедурный интерфейс</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает асинхронные неблокирующие запросы через драйвер mysqlnd</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Постоянные соединения</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает кодировки</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает подготовленные запросы на стороне сервера</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает подготовленные запросы на стороне клиента</entry>
|
||
<entry>Нет</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает хранимые процедуры</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает множественные запросы</entry>
|
||
<entry>Да</entry>
|
||
<entry>Большинство</entry>
|
||
</row>
|
||
<row>
|
||
<entry>API поддерживает транзакции</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Транзакции контролируются через SQL</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Поддерживает функциональность MySQL 5.1+</entry>
|
||
<entry>Да</entry>
|
||
<entry>Большинство</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</chapter>
|
||
|
||
<chapter xmlns="http://docbook.org/ns/docbook" xml:id="mysqlinfo.library.choosing">
|
||
<title>Выбор библиотеки</title>
|
||
<simpara>
|
||
Модули mysqli и PDO_MySQL — легковесные обёртки поверх клиентской библиотеки языка C.
|
||
Модули работают либо с библиотекой драйвера <link linkend="book.mysqlnd">mysqlnd</link>,
|
||
либо с клиентской библиотекой языка C <literal>libmysqlclient</literal>.
|
||
Библиотеку выбирают на этапе компиляции.
|
||
</simpara>
|
||
<simpara>
|
||
Библиотека mysqlnd — часть дистрибутива PHP.
|
||
Библиотека предлагает функции наподобие ленивых соединений и кеширования запросов,
|
||
включая средства, которые недоступны в библиотеке libmysqlclient,
|
||
поэтому настоятельно рекомендуется выбирать встроенную в PHP библиотеку mysqlnd.
|
||
<link linkend="book.mysqlnd">Документация по mysqlnd</link> даёт дополнительную информацию
|
||
и список средств и функциональности, которую предлагает драйвер.
|
||
</simpara>
|
||
<example>
|
||
<title>Команды конфигурирования модуля mysqlnd или библиотеки libmysqlclient</title>
|
||
<programlisting role="shell">
|
||
<![CDATA[
|
||
|
||
// Рекомендуется, компилируется с драйвером mysqlnd
|
||
$ ./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
|
||
|
||
// Рекомендуется, компилируется с драйвером mysqlnd
|
||
$ ./configure --with-mysqli --with-pdo-mysql
|
||
|
||
// Не рекомендуется, компилируется с библиотекой libmysqlclient языка C
|
||
$ ./configure --with-mysqli=/path/to/mysql_config --with-pdo-mysql=/path/to/mysql_config
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<simpara>
|
||
<emphasis role="bold">Сравнение библиотек</emphasis>
|
||
</simpara>
|
||
<simpara>
|
||
PHP-программистам рекомендуют работать с драйвером <link linkend="book.mysqlnd">mysqlnd</link>,
|
||
а не с клиентской библиотекой MySQL Client Server, которая распространяется как пакет libmysqlclient.
|
||
Обе библиотеки поддерживаются и непрерывно совершенствуются.
|
||
</simpara>
|
||
<informaltable xml:id="mysqlinfo.library.choosing.changelog">
|
||
<tgroup cols="3">
|
||
<thead>
|
||
<row>
|
||
<entry/>
|
||
<entry>Родной PHP-драйвер MySQL Native Driver (<link linkend="book.mysqlnd">mysqlnd</link>)</entry>
|
||
<entry>Клиентская библиотека MySQL Client Server (<literal>libmysqlclient</literal>)</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
<row>
|
||
<entry>Часть дистрибутива PHP</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Версия PHP, в которой появилась библиотека</entry>
|
||
<entry>5.3.0</entry>
|
||
<entry>Нет данных</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Лицензия</entry>
|
||
<entry>PHP License 3.01</entry>
|
||
<entry>Двойная лицензия</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Статус разработки</entry>
|
||
<entry>Активный</entry>
|
||
<entry>Активный</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Жизненный цикл</entry>
|
||
<entry>Окончание не анонсировано</entry>
|
||
<entry>Окончание не анонсировано</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Компиляция по умолчанию (для всех модулей MySQL)</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Поддержка протокола сжатия</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Поддержка протокола SSL</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Поддержка именованных конвейеров</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Неблокирующие асинхронные запросы</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Статистика производительности</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>
|
||
Конфигурация LOAD LOCAL INFILE учитывает директиву <link linkend="ini.open-basedir">open_basedir</link>
|
||
</entry>
|
||
<entry>Да</entry>
|
||
<entry>нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>
|
||
Взаимодействие со внутренней системой управления памятью PHP (например, соблюдение ограничений памяти PHP)
|
||
</entry>
|
||
<entry>Да</entry>
|
||
<entry>Нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Возврат числовых столбцов как целочисленных значений double (COM_QUERY)</entry>
|
||
<entry>Да</entry>
|
||
<entry>нет</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Возврат числовых столбцов как строк (string) (COM_QUERY)</entry>
|
||
<entry>Да</entry>
|
||
<entry>Да</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Поддержка API плагинов</entry>
|
||
<entry>Да</entry>
|
||
<entry>Ограниченно</entry>
|
||
</row>
|
||
<row>
|
||
<entry>Автоматическое переподключение</entry>
|
||
<entry>нет</entry>
|
||
<entry>опционально</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
</chapter>
|
||
|
||
&reference.mysqlinfo.concepts;
|
||
|
||
</book>
|
||
|
||
&reference.mysqli.book;
|
||
&reference.mysql-xdevapi.book;
|
||
&reference.mysql.book;
|
||
&reference.mysqlnd.book;
|
||
|
||
</set>
|