Помогите пожалуйста, как динамично создать простую карту сайта в данном фреемворке? На сайте есть статьи, ссылка на них "имя сайта/forecast/1" где 1 это id статьи.
Как вообще это делается? В поисковике не смог найти внятных объяснений.
Примерно представляю, что делается запрос к БД, потом сформировывается xml и сохраняется в файл. Но с запросом к БД возрастает и количество этих запросов, не очень хотелось бы, чтобы их было много. Хостинг жалуется на них. Yii2 в этом плане очень плохо оптимизирован.
Не видя кода и данных отладки трудно что либо сказать конкретно.
Количество запросов зависит от количества сущностей для которых вы строите карту сайта (N).
Так же количество запросов зависит от количества подключаемых связей в них (N*M).
Почитайте про отложенную и жадную загрузку.
Научитесь пользоваться дебаггером (Yii Debug Panel). Там пишется сколько ресурсов и куда уходит, сколько времени тратится на выполнение запросов, в каком порядке они выполняются и какой участок кода вызывает их выполнение.
Далее почитайте про кэширование результатов запросов во фреймворке.
И еще, возможен вариант, что не индексированы поля в БД и поэтому БД дает нагрузку (тупо перебирает все записи вместо поиска по индексу).
Если все это не помогает.
Делаете задачу в консоли на формирование файла с картой сайта.
Задача кладет файл куда Вам нужно.
Далее настраиваете крон с этим задании. Периодичность выбираете в зависимости от периодичности обновления сайта и необходимости актуализации. Это позволить не делать сложные запросы при каждом посещении или запросе карты сайта.
Дебагером умею пользоваться. Кэширование в Yii очень сложное и не понятно как работает. Поэтому оно отпало сразу же. Единственное что на ум приходит, это при сохранении добавлять в кэш статью, и обновлять кэш если статья обновилась, и тогда от туда можно тянуть данные для карты сайта.
Но опять же, возможно ли это все сделать, ведь как всегда, ответов нигде нет, есть отрезки догадок как что должно работать, типа доки, но внятно никто ничего не обьсняет. Вроде и хочется все сделать нормально, но тратить кучу времени и копать во всем этом, как то нет желания, так как времени и так нет
Если умеете пользоваться дебаггером - значит можете посмотреть, какой запрос сколько по времени выполняется. Самые толстые запросы загоняем в профилировщик запросов и смотрим, почему так долго.
Если запросов больше 10ти, допустим, или они все почти одинаковые, нужно менять логику вытягивания данных (жадная и отложенная загрузка).
Проще всего включить кэш для результатов выполнения запросов.
Включается так, примерно:
Article::find()
->where(['active' => 1])
->cache(3600 * 24) //кэш в секундах. По прошествии этого времени он сбрасывается.
->all();
Кэш по умолчанию файловый и особой настройки не требует. Должен работать из коробки.
Насчет кэша статьи не совсем понятно, что Вы имеете ввиду. По идее всю статью для карты сайта бессмысленно складывать в кэш. Скорее список наименований и ссылок на них.
А про кэш статьи, я про то, ну вот я написал статью в админке, нажал сохранить, и в это время статья сохраняется в бд и в кэш, а потом ее от туда вытаскивать на сайт, получится. что запросов к бд не будет, или будет минимум.... Может это глупо конечно
Для карты сайта не нужно вытаскивать статью отдельно. Нужно вытащить название и ссылку (ну м.б. еще анонс). Точнее массив из названий и ссылок. И этот массив можно закешировать. И лучше результат выборки нужных статей, если не знаете как работать с кэшем.
bashcod, нет, ну на главной все статьи должны быть, в категории определенное статьи, и так они и вытаскиваются. Где одна статья, она вытаскивается одна, по id. Там еще много запросов от пагинации...... Ладно, может придумаю что нибудь
Вы спрашиваете сначала про sitemap, а заканчиваете главной страницей и пангинацией)))
Жадную и отложенную загрузку все таки рекомендую освоить.
Извините за назойливость)))
bashcod, ну я продолжил тему кэша, она меня тоже беспокоит просто))) Извиняюсь, если что)
Да, согласен, буду читать и пробовать такие запросы. А про пагинацию, просто она тоже идет от запроса и там тоже много запросов идет))) Эх, ладно, буду пробовать все потихоньку)