mysqlnd

в 10:51, , рубрики: mysql, mysqlnd, php, асинхронные запросы к БД, метки: , , ,

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 к этой функции).

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

Плагины

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

Mysqlnd replication and load balancing plugin

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

Mysqlnd query result cache plugin

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

Mysqlnd user handler plugin

Расширение предоставляет ряд хуков, выполняемых во время работы драйвера. Обработчики для этих хуков можно описывать на PHP, наследуя классы расширения

Автор: aeryaguzov

Поделиться

* - обязательные к заполнению поля