Я внимательно посмотрел на потребление памяти Wordpress. На моем сайте кажется, что для каждой страницы выделяется 20 МБ ОЗУ, просто для того, чтобы подготовить удобную среду для запуска всех плагинов. Я построил это так:
Нет ни единого места для оптимизации, ни одного плохого парня, который съел бы большую часть памяти. Потребление распространяется на многие многие многие модули PHP.
Как мы можем заставить Wordpress инициализировать свое окружение в памяти только один раз, а затем многократно использовать его для каждого удара? Я не хочу, чтобы медленный PHP потреблял 20 МБ при каждом клике пользователя - даже на сервере с большим объемом памяти для выполнения всей этой работы требуются секунды. В основном вам понадобятся блоки памяти, доступные только для чтения, которые можно использовать повторно.
Кроме того ... почему 20 МБ? Кто-нибудь может дать представление об этом?
Редактировать: Вот вывод WinCacheGrind на Wordpress, работающий на моей машине разработки (значительно быстрее, чем общий хостинг). Как видите, на создание HTML-кода главной страницы уходит более секунды. Замедлите это на общем хостинге, и у вас есть рецепт для неприятностей. Я выбрал метод, который занимает большую часть времени. Как бы вы пошли на оптимизацию этого?
Изменить: Вот статистика запросов из этого фантастического инструмента профилирования functions.php .
Загрузка: 12 запросов - 532 мс - 19,1 МБ - 43 попадания в кэш / 53 Запрос: 15 запросов - 563 мс - 19,0 МБ - 72 попадания в кеш / 86 Отображение: 21 запрос - 705 мс - 19,2 МБ - 234 попадания в кэш / 257
Редактировать: Вы хотите увидеть что-то гарантированно волновать вас? Вставьте эти строки в конец index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
Я пытался подсчитать, сколько раз тело текущего сообщения хранится в памяти. Я насчитал 20 экземпляров. Затем я понял, что в PHP есть счетчик ссылок, поэтому количество копий сократилось до трех: две, похоже, в WP_Query, одна в кеше объектов. Я расследую дальше.
Вот почему я думаю, что WordPress нуждается в рефакторинге для решения проблем с памятью. Вы больше не можете винить потребление памяти за сложность того, что он делает. Это просто делает кучу вещей неправильно .
Изменить: После дня, чтобы попытаться выяснить это, вот мои выводы:
1) 88% всей памяти поступает от вызовов типа require, include или include_once:
2) Включение php-файла происходит в основном во время первой части обработки запроса (что неудивительно), когда также используется вся память:
3) Довольно интересно отобразить все функции, которые выполняются во время выполнения запроса. Всего более 12000 звонков. Я встряхнул их, чтобы сделать их более заметными (ось уровня - это глубина стека):
4) Единственный способ продвижения вперед, о котором я могу подумать, - это минимизация количества включаемых файлов .php. Если я разделю функции по файлам, из которых они получены, вы увидите, что многие файлы удаляются один или два раза. Нам нужен способ, как пропустить те, когда они не нужны. Например, мой плагин для удаленного резервного копирования базы данных загружается и регистрируется, просто чтобы никогда не использоваться вообще. Вот вышеупомянутый график, разделенный по имени файла:
Я предлагаю вознаграждение, достойное всей моей репутации :) за рефакторинги, которые приведут к сокращению объема памяти моего блога на 30% и более.
Редактировать: я установил WP 3.1, вот сравнение со старой версией.
Синий - это WP 3.1, красный - это 3.0.4. Новый WP быстрее, но и кушает больше памяти.
Вот список по включаемому файлу.
Это позволило мне понять, сколько памяти потребляется «Все в одном SEO-пакете» - одним способом было бы использовать только часть функциональности плагина, чтобы получить то, что я хочу. Кроме того, мои собственные плагины кажутся довольно плохими.
Я хотел бы попробовать условную загрузку, например, на comment.php (я запрещаю комментарии в моем блоге) и некоторых других. Я удалил весь устаревший код. Я урезал kses.php, чтобы загружать только его глобальные таблицы по требованию. Я упростил l10n (я не делаю локализацию), заставляя его функции возвращать строки сразу, без поиска. Я все еще далек от 30-процентной отметки, которую я произвольно установил.
Изменить: Я загрузил и включил APC с настройками по умолчанию (32 МБ кэш-кода операции). Вот сравнение:
Вы можете видеть, что загрузка кода значительно ускорилась, и код также занимает меньше места в памяти (вероятно, потому что мы имеем дело только с кодами операций, а не с исходным кодом). Потребление памяти, однако, все еще довольно высоко.