Прочитал в блоге Ars Longa, Vita Brevis о том, как можно снизить пиковое потребление оперативной памяти совершенно бесплатно, заменив всего лишь одну функцию в системной файле WordPress. Автор статьи говорит о том, что пиковое потребление оперативной памяти снижается почти в два раза, поэтому грех не воспользоваться таким советом.
Так в чем же секрет? А секрета никакого нет, а есть хитрость работы с MySQL. При запросе к базе данных есть два варианта работы с результатами – сохранение результатов запроса в буфер или последовательная обработка результата.
WordPress использует именно первый вариант, который отличается агрессивным использованием оперативной памяти: выделяется память для временного буфера, в который записывается весь результат запроса, затем создается локальная копия результата запроса, и лишь только после этого временный буфер освобождается.
В итоге потребляется в два раза больше памяти, чем нужно для второго варианта, при котором никакой буферизации не происходит, все результаты отдаются сервером напрямую к клиенту, минуя создание всяких временных таблиц в буфере, обработка результатов производится последовательно.
В общем, не буду больше утомлять вас разбором механизмов буферизации, а перейду сразу к рецепту. В первом варианте используется функция mysql_query(), а во втором – mysql_unbuffered_query(). Значит нужно одну функцию заменить другой. Находим файл /wp-includes/wp-db.php, создаем на всякий случай его резервную копию, и меняем в нем
mysql_query
на
mysql_unbuffered_query
На этом все.
Очень познавательная статья, но хотелось бы услышать во первых использует ли сам автор сейчас эту фишку, а также интересны отзывы тех кто пользуется и отзывы так сказать экспертов. Просто не хочется хакать блог не подумав.
Да, я использую сейчас эту фишку.
Как определить, что есть улучшение? Себе сделал, но основные показатели запрос-время-оперпамять теже.
При низкой посещаемости (до 1000 в день) выигрышь практически незаметен.
Попробовал. Но так как у меня стоит eaccelerator и memcached исключительно для буферизации запросов к mysql, то я получил проигрыш по памяти примерно в 400 килобайт. :)