Снижение пикового потребления памяти благодаря в два раза заменой одной функции
Пиковое потребление оперативной памяти WordPress можно снизить приблизительно два раза и практически бесплатно. В чём секрет? В использовании правильных функций для работы с базой данных.
Опытные программисты знают, что API MySQL предоставляет два варианта работы с результатом запроса:
- Последовательная обработка результата — при этом не происходит никакой буферизации результата, данные отдаются от сервера клиенту, минуя временные таблицы и буфера. В этом случае обработка результатов может производиться только последовательно.
- Буферирование результата запроса — результат полностью читается во временный буфер, что позволяет осуществлять произвольный доступ к результату.
Первому варианту соответствует использование функции PHP mysql_unbuffered_query()
, второму — mysql_query()
.
WordPress использует именно второй вариант. Но специфика функции wpdb::query()
такова, что, выполнив запрос, WordPress полностью читает ответ в переменную wpdb::last_result
.
Таким образом, при выполнении запроса, возвращающего большой объём данных:
- MySQL выделит память для временного буфера под весь результат запроса
- WordPress создаст локальную копию результата запроса
- После вызова
mysql_result_free()
временный буфер будет освобождён
В результате связка WordPress + MySQL съест в два раза больше памяти, чем нужно. Это особенно ощутимо на системах с небольшим количеством доступной оперативной памяти.
Лечение: в файле wp-includes/wp-db.php
заменяем mysql_query
на mysql_unbuffered_query
.
Из бонусов: при использовании mysql_unbuffered_query()
PHP будет получать данные по мере их доступности (во время выполнения запроса), в то время как при использовании mysql_query()
пришлось бы ждать окончания выполнения запроса.
Использование небуферизованных запросов, судя по отзывам, очень сильно позволяет повысить производительность.
Sorry, the comment form is closed at this time.