Pull to refresh

mysqlnd

Reading time2 min
Views48K
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, наследуя классы расширения
Tags:
Hubs:
Total votes 67: ↑57 and ↓10+47
Comments51

Articles