1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files

480 lines
22 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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>