Небуферизованные запросы: снижаем потребление памяти WordPress

Снижение пикового потребления памяти благодаря в два раза заменой одной функции

Пиковое потребление оперативной памяти можно снизить приблизительно два раза и практически бесплатно. В чём секрет? В использовании правильных функций для работы с базой данных.

Опытные программисты знают, что API предоставляет два варианта работы с результатом запроса:

  1. Последовательная обработка результата — при этом не происходит никакой буферизации результата, данные отдаются от сервера клиенту, минуя временные таблицы и буфера. В этом случае обработка результатов может производиться только последовательно.
  2. Буферирование результата запроса — результат полностью читается во временный буфер, что позволяет осуществлять произвольный доступ к результату.

Первому варианту соответствует использование функции mysql_unbuffered_query(), второму — mysql_query().

WordPress использует именно второй вариант. Но специфика функции wpdb::query() такова, что, выполнив запрос, WordPress полностью читает ответ в переменную wpdb::last_result.

Таким образом, при выполнении запроса, возвращающего большой объём данных:

  1. MySQL выделит память для временного буфера под весь результат запроса
  2. WordPress создаст локальную копию результата запроса
  3. После вызова mysql_result_free() временный буфер будет освобождён

В результате связка WordPress + MySQL съест в два раза больше памяти, чем нужно. Это особенно ощутимо на системах с небольшим количеством доступной оперативной памяти.

Лечение: в файле wp-includes/wp-db.php заменяем mysql_query на mysql_unbuffered_query.

Из бонусов: при использовании mysql_unbuffered_query() PHP будет получать данные по мере их доступности (во время выполнения запроса), в то время как при использовании mysql_query() пришлось бы ждать окончания выполнения запроса.

Использование небуферизованных запросов, судя по отзывам, очень сильно позволяет повысить производительность.

Автор: ; опубликовано в: WordPress; метки: MySQL, PHP, WordPress, база данных, оптимизация
2
Сен
2010

RSS Комментарии к статье «Небуферизованные запросы: снижаем потребление памяти WordPress» (26)  »

  1. сделал эту подмену. Теперь выдается ошибка:
    Fatal error: Call to undefined method wpdb::set_prefix() in /home/psimho/domains/sheva.name/public_html/wp-settings.php on line 212
    вернул обратно бекап файла wp-db.php, но ошибка осталась.
    Помогите вернуть все обратно, плиз.

    • Ищите проблему в другом месте.

      Call to undefined method wpdb::set_prefix() означает, что $wpdb — не wpdb. Перепишите wp-includes/wp-db.php из дистрибутива WordPress

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Небуферизованные запросы: снижаем потребление памяти WordPress»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा