Как стать автором
Обновить

mysqlnd

Время на прочтение2 мин
Количество просмотров49K
mysqlnd — расширение PHP, которое является драйвером для работы с MySQL по умолчанию в PHP 5.4. Оно работает напрямую с MySQL сервером, а значит, MySQL клиент, а также оверхед на работу с ним, больше не требуется!

image



mysqli_fetch_all


Несмотря на то, что API для работы с MySQL не изменилось (расширения mysqli и PDO), в расширении mysqli появились новые функции, среди которых стоит выделить функцию mysqli_fetch_all.

Ранее для получения полного результата выборки приходилось писать подобную конструкцию:

$result = mysqli_query($link, $query);

$data = array();
while($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}



В случае использования mysqli_fetch_all использования подобных конструкций можно избежать:

$result = mysqli_query($link, $query);
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);


Native memory management


В следствие того, что mysqlnd является расширением PHP, у нас появляется возможность контролировать(а также смотреть статистику выделения памяти через memory_get_usage) выделение памяти при работе с MySQL.

Другими словами, ранее, следующий скрипт мог упасть с превышением памяти, только в случае, если размер переменной $data превысил указанный в скрипте предел выделения памяти, при этом кол-во данных полученное из базы могло быть бесконечно большим:

ini_set('memory_limit', '1M');

$result = mysqli_query($link, $query);

$data = array();
while($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}



В случае использования mysqlnd такой скрипт упадет с превышением памяти, когда кол-во данных из базы превысит предел выделения памяти, указанный в скрипте.

Кстати в случае использования mysqlnd, если вы посылаете запрос, который весит больше, чем max_allowed_packet на сервере MySQL в Linux вам вернется ошибка, указывающая на это: «1153: got a packet bigger than max_allowed_packet bytes», а вот в Windows или в случае использования старого драйвера получите ошибку: «2006: Server has gone away».

Асинхронные запросы


mysqlnd предоставляет способ выполнения асинхронных запросов в MySQL, то есть нет необходимости ожидать результатов выполнения запроса для продолжения работы скрипта.

Для выполнения асинхронного запроса необходимо указать флаг MYSQLI_ASYNC в mysqli_query

Проверяются результаты запроса через mysqli_poll, в случае если запрос отработал, результаты можно получить через mysqli_reap_async_query (обратите пожалуйста внимание на note к этой функции).

Увы, пока я не до конца разобрался со всеми нюансами использования асинхронных запросов и постараюсь представить отдельный обзор с кейсами в самом ближайшем будущем, если это кому-нибудь будет интересно.

UPD: мой пост про асинхронные запросы в mysqlnd можно посмотреть здесь

Плагины


mysqlnd предоставляет API для написания плагинов, благодаря которому на свет появились очень полезные расширения:

Mysqlnd replication and load balancing plugin

Расширение позволяет с помощью простого конфига автоматически распределять запросы в MySQL путем отправки всех запросов на чтение на слейвы, а запросов на запись на мастер.

Mysqlnd query result cache plugin

Расширение позволяет кешировать результаты запросов на уровне драйвера в самых популярных движках кэширования (APC, Memcache, SQLite, можно и свой добавить)

Mysqlnd user handler plugin

Расширение предоставляет ряд хуков, выполняемых во время работы драйвера. Обработчики для этих хуков можно описывать на PHP, наследуя классы расширения
Теги:
Хабы:
Всего голосов 67: ↑57 и ↓10+47
Комментарии51

Публикации

Истории

Работа

PHP программист
168 вакансий

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань