mysqlnd — расширение PHP, которое является драйвером для работы с MySQL по умолчанию в PHP 5.4. Оно работает напрямую с MySQL сервером, а значит, MySQL клиент, а также оверхед на работу с ним, больше не требуется!
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, можно и свой добавить)
Расширение предоставляет ряд хуков, выполняемых во время работы драйвера. Обработчики для этих хуков можно описывать на PHP, наследуя классы расширения
Автор: aeryaguzov