- PVSM.RU - https://www.pvsm.ru -
mysqlnd — расширение PHP, которое является драйвером для работы с MySQL по умолчанию в PHP 5.4. Оно работает напрямую с MySQL сервером, а значит, MySQL клиент, а также оверхед на работу с ним, больше не требуется!
Несмотря на то, что API для работы с MySQL не изменилось (расширения mysqli и PDO), в расширении mysqli появились новые функции, среди которых стоит выделить функцию mysqli_fetch_all [1].
Ранее для получения полного результата выборки приходилось писать подобную конструкцию:
$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);
В следствие того, что mysqlnd является расширением PHP, у нас появляется возможность контролировать(а также смотреть статистику выделения памяти через memory_get_usage [2]) выделение памяти при работе с 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 [3]
Проверяются результаты запроса через mysqli_poll [4], в случае если запрос отработал, результаты можно получить через mysqli_reap_async_query [5] (обратите пожалуйста внимание на note к этой функции).
Увы, пока я не до конца разобрался со всеми нюансами использования асинхронных запросов и постараюсь представить отдельный обзор с кейсами в самом ближайшем будущем, если это кому-нибудь будет интересно.
mysqlnd предоставляет API [6] для написания плагинов, благодаря которому на свет появились очень полезные расширения:
Mysqlnd replication and load balancing plugin [7]
Расширение позволяет с помощью простого конфига автоматически распределять запросы в MySQL путем отправки всех запросов на чтение на слейвы, а запросов на запись на мастер.
Mysqlnd query result cache plugin [8]
Расширение позволяет кешировать результаты запросов на уровне драйвера в самых популярных движках кэширования (APC, Memcache, SQLite, можно и свой добавить)
Mysqlnd user handler plugin [9]
Расширение предоставляет ряд хуков, выполняемых во время работы драйвера. Обработчики для этих хуков можно описывать на PHP, наследуя классы расширения
Автор: aeryaguzov
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/mysql/17148
Ссылки в тексте:
[1] mysqli_fetch_all: http://php.net/manual/en/mysqli-result.fetch-all.php
[2] memory_get_usage: http://http://www.php.net/manual/en/function.memory-get-usage.php
[3] mysqli_query: http://php.net/manual/en/mysqli.query.php
[4] mysqli_poll: http://www.php.net/manual/en/mysqli.poll.php
[5] mysqli_reap_async_query: http://php.net/manual/en/mysqli.reap-async-query.php
[6] API: http://www.php.net/manual/ru/mysqlnd.plugin.php
[7] Mysqlnd replication and load balancing plugin: http://php.net/mysqlnd_ms
[8] Mysqlnd query result cache plugin: http://php.net/mysqlnd_qc
[9] Mysqlnd user handler plugin: http://www.php.net/manual/ru/book.mysqlnd-uh.php
Нажмите здесь для печати.