Mysqlnd

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

mysqlnd



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);



Встроенное управление памятью
Благодаря тому, что 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: получен пакет размером больше max_allowed_packet байт», но в Windows или в случае использования старого драйвера вы получите сообщение об ошибке: «2006: Сервер пропал».



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

Для выполнения асинхронного запроса необходимо указать флаг MYSQLI_ASYNC в mysqli_query Результаты запроса проверяются через mysqli_poll , если запрос обработан, результаты можно получить через mysqli_reap_async_query (обратите внимание на примечание к этой функции).

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

УПД: вы можете увидеть мой пост об асинхронных запросах в mysqlnd Здесь

Плагины
mysqlnd предоставляет API за написание плагинов, благодаря которым родились очень полезные расширения: Плагин Mysqlnd для репликации и балансировки нагрузки Расширение позволяет с помощью простого конфига автоматически распределять запросы в MySQL, отправляя все запросы на чтение слейвам, а запросы на запись мастеру.

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

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

Теги: #php #MySQL #mysqlnd #mysqli_fetch_all #асинхронные запросы к базе данных #полезные расширения PHP #php #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.