Из-за вывода блока меню (около 60 пунктов в 2-уровневой иерархии) сайт дико тормозит. Меню построено с помощью Taxonomy Menu, все эти пункты - термины таксономии. Плюс еще 2 языка на сайте.
Среди запросов огромное количество _taxonomy_menu_get_item, menu_get_item, DrupalDefaultEntityController::load, metatag_metatags_load_multiple
Вот то что показывает devel с включенным блоком меню и без него:
Executed 2233 queries in 983.98 ms. Queries exceeding 5 ms are highlighted. Page execution time was 13535.76 ms. Memory used at: devel_boot()=5.29 MB, devel_shutdown()=179.34 MB, PHP peak=195.75 MB.
Executed 178 queries in 145.01 ms. Queries exceeding 5 ms are highlighted. Page execution time was 1544.43 ms. Memory used at: devel_boot()=5.31 MB, devel_shutdown()=68.13 MB, PHP peak=74 MB.
Сверх тяжелых запросов нет, самые тяжелые - _locale_rebuild_js около 100мс +-. Еще два на 5-10 мс. Все остальные меньше 5мс. Но их нереально много.
Как можно оптимизировать вывод меню? В голову пока приходит только скриптом генерировать чистый хтмл и выдавать его вместо блока меню. Но хотелось бы как-то более красиво решить этот вопрос.
Ответы
Это просто магия какая-то. Огромная благодраность!
После добавления модуля с таким кодом:
Executed 911 queries in 398.25 ms. Queries exceeding 5 ms are highlighted. Page execution time was 2314.41 ms. Memory used at: devel_boot()=5.3 MB, devel_shutdown()=72.46 MB, PHP peak=78.5 MB.
дальше есть куда стремиться, конечно. Но этот блок с меню таксономии теперь хоть не генерируется по 10 секунд.
Попробуйте модуль taxonomy menu block. Была такая же проблема на одном из сайтов, это помогло
Проверил, тоже отлично сокращает время генерации страницы, но в моем конкретном случае не подходит из-за других моментов.
Если кто столкнется с похожей проблемой - можно смело использовать этот модуль.
Вот, можете попробовать загружать данный блок с меню асинхронно.
Вот материал по этому вопросу - http://sanchiz.net/blog/drupal-lazyload
И вот модули
https://www.drupal.org/project/blocklazyloader
https://www.drupal.org/project/ajaxblocks
Сначала попробуйте замерить производительность без блоков с таксономи-меню.
Если точно только они так влияют на нагрузку, значит надо придумать, как их генерировать менее затратно по ресурсам.
Если количество уровней меню постоянно(как вы писали - 2 уровня) то такое меню можно сгенерировать и вьюсом.
Количество запросов в любом случае должно уменьшиться.
Ну и однозначно - кэширование результата.
Скажите пожалуйста, а на чем сайт хостится ?
виртуальный сервер. хостинг адекватный, на нем хостится еще несколько проектов, они работают отлично, у этих проектов нет меню из таксономии.
Может, с кешированием что-то не то ? Закешировать этот блок возможно ?
Можно, кешируется без проблем на странице. Во второй раз анонимам выводится страница меньше чем за секунду. Но первый раз страницу все равно грузит по 10-20 секунд. Это вообще неприемлемо.
Ну если такая ситуация и изменить хостинг нельзя принципиально, то может быть, поступить таким образом ?
Сделать так, чтобы сначала отобразилась страница с пустым блоком, а потом с помощью JQuery + AJAX дотянулся бы этот блок ? То есть, страница уже есть и отображается посетителям, и в это время на страницу дотягивается этот блок.