Небуферизованные запросы: снижаем потребление памяти WordPress
Снижение пикового потребления памяти благодаря в два раза заменой одной функции
Пиковое потребление оперативной памяти 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() пришлось бы ждать окончания выполнения запроса.
Использование небуферизованных запросов, судя по отзывам, очень сильно позволяет повысить производительность.
Автор: Wandering Soul; опубликовано в: WordPress; метки: MySQL, PHP, WordPress, база данных, оптимизацияСен
2010
Комментарии к статье «Небуферизованные запросы: снижаем потребление памяти WordPress» (26) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Небуферизованные запросы: снижаем потребление памяти WordPress»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


сделал эту подмену. Теперь выдается ошибка:
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Спасибо, помогло.