Производительность TYPO3 6.2, Typoscript Select, Typoscript Cache
Сама проблема решена, но вопрос все еще остается открытым, потому что я хочу проверить подсказки от Кристиана. См. Редактировать 3 внизу этого вопроса.
У меня есть проект TYPO3, который очень медленный. Поэтому я провел несколько тестов и обнаружил некоторые проблемы.
Я тестировал стартовую страницу, стартовую страницу, контейнер 2, список новостей (всего 9 статей) (tx_news версия 2.3.0 - не самая новая). Он содержит меню (созданное с помощью Fluid v:page.menu), нижний колонтитул (также созданный с помощью v: page.menu), правый столбец (в основном элементы содержимого изображения, собранные с другой страницы с typoscript) и список тегов новостей (создан с опечаткой). Список новостей используется дважды - один раз в меню и один раз в правом столбце.
Сначала обзор производительности:
No Menu/No Footer (without taglist), No News, No Labellist
0.65s
With menu and footer (without taglist)
0.95s
With menu and footer (with taglist)
2.3s
With menu and footer (with taglist) and Taglist in right column
3s
With all
4.2s
Важным моментом является список тегов (сейчас всего 1303 тега). вот Typoscript, который генерирует список тегов:
plugin.tx_mytemplate {
newsTags = CONTENT
newsTags {
table = tx_news_domain_model_tag
select {
pidInList = 1,589
hidden = 0
deleted = 0
orderBy = title
}
orderBy = title
renderObj = COA
renderObj {
1 = LOAD_REGISTER
1 {
Counter.cObject = TEXT
Counter.cObject.data = register:Counter
Counter.cObject.wrap = |+1
Counter.prioriCalc = intval
}
2 = TEXT
2.insertData = 1
2 = TEXT
2.insertData = 1
2.field = title
2.typolink {
# link to page
parameter = 588
# the current tag
additionalParams = &tx_news_pi1[overwriteDemand][tags]={field:uid}
additionalParams.insertData = 1
}
2.wrap = <li data-test="{field:uid}" data-index="{register:Counter}">|</li>
}
wrap = <ul>|</ul>
}
}
Я использую это один раз в меню и один раз в элементе контента с:
<f:cObject typoscriptObjectPath="plugin.tx_mytemplate.newsTags" />
Что я не понимаю, так это то, что для моего понимания не должно быть большой разницы в использовании его один или два (или даже больше), потому что после первого использования должен быть создан объект typoscript, и нет необходимости его создавать второй раз. Я что-то здесь упускаю?
Это SQL:
SELECT * FROM tx_news_domain_model_tag WHERE tx_news_domain_model_tag.pid IN (1,589) AND tx_news_domain_model_tag.deleted=0 AND tx_news_domain_model_tag.hidden=0 ORDER BY title;
Для выполнения этого запроса требуется 0,004 с. Поэтому другой момент, который я не понимаю, заключается в том, почему создание такого опечатного объекта так дорого? Это typolink, который используется для создания всех 1303 ссылок? (Я использовал realURL)
Кроме того, этот список тегов меняется не часто, возможно ли как-то его полностью кэшировать? И, например, создавать новый список тегов только при выполнении общих кэшей Flush (или кэшей внешнего интерфейса)?
Есть другие идеи? (Я знаю, что могу загрузить список тегов через ajax после загрузки страницы, но это только последний обходной путь, и, возможно, есть лучшие решения)
Изменить: я проверил список тегов без typolink и его примерно на 1 с быстрее. Это означает, что создание typolink для 1303 Link стоит около 1 с.
Редактировать 2: я нашел скрытый config.no_cache = 1
И тестирование прямо сейчас, если все работает, когда кэш включен. Но в любом случае меня интересует, почему typolink такой дорогой.
,
Редактировать 3: Я проверяю ответ Кристиана:
Кэшируйте объект Typoscript с помощью stdWrap.cache.key = someHash
plugin.tx_mytemplate {
newsTags = CONTENT
newsTags {
table = tx_news_domain_model_tag
select {
pidInList = 1,589
hidden = 0
deleted = 0
orderBy = title
}
orderBy = title
renderObj = COA
renderObj {
1 = LOAD_REGISTER
1 {
Counter.cObject = TEXT
Counter.cObject.data = register:Counter
Counter.cObject.wrap = |+1
Counter.prioriCalc = intval
}
2 = TEXT
2.insertData = 1
2 = TEXT
2.insertData = 1
2.field = title
2.typolink {
# link to page
parameter = 588
# the current tag
additionalParams = &tx_news_pi1[overwriteDemand][tags]={field:uid}
additionalParams.insertData = 1
}
2.wrap = <li data-test="{field:uid}" data-index="{register:Counter}">|</li>
}
wrap = <ul>|</ul>
stdWrap.cache.key = mytaglist
stdWrap.cache.lifetime = unlimited
}
}
Я не вижу никаких изменений во времени загрузки. Есть ли способ проверить, действительно ли этот объект кэшируется? Неужели я что-то не так?
Использование VHS для кэширования контента с v:render.cache
Я заменил
<f:cObject typoscriptObjectPath="plugin.tx_mytemplate.newsTags" />
с
<v:render.cache content="<f:cObject typoscriptObjectPath='plugin.tx_mytemplate.newsTags' />" identity="test1234" />
Кажется, работает, потому что первый звонок нужно дольше. Но тогда следующий вызов будет "нормальным" (так как я бы не использовал v.render.cache), пока я не вытащу часть содержимого и просто не использую идентификатор:
<v:render.cache content="test" identity="test1234" />
Это быстрее и по-прежнему отображает список тегов. Так что это работает до сих пор, что кешированная версия позади test1234
используется. Но также кажется, что он оказывает f:cObject typoscript object
в содержательной части каждый раз. Что мне здесь не хватает?
Даже страннее, когда я использую код с content="test"
а также flush frontend caches
а также flush general caches
список тегов по-прежнему отображается (а не "тест"). Документ гласит: The cache behind this ViewHelper is the Extbase object cache, which is cleared when you clear the page content cache.
, Что такое кеш контента страницы? Не один из двух flush frontend caches
или же flush general caches
?
Редактировать 4: с включенным кешем я обнаружил проблему с плагином новостей. Я использую realURL для газетного плагина:
'category' => array(
array(
'GETvar' => 'tx_news_pi1[overwriteDemand][categories]',
'lookUpTable' => array(
'table' => 'tx_news_domain_model_category',
'id_field' => 'uid',
'alias_field' => 'CONCAT(title, "-", uid)',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-'
)
)
)
),
'tag' => array(
array(
'GETvar' => 'tx_news_pi1[overwriteDemand][tags]',
'lookUpTable' => array(
'table' => 'tx_news_domain_model_tag',
'id_field' => 'uid',
'alias_field' => 'CONCAT(title, "-", uid)',
'addWhereClause' => ' AND NOT deleted',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-'
)
)
)
),
Вызов ссылки на категорию работает без проблем, но когда я вызываю ссылку на тег, я вижу только новости с первого попадания (изменение тега ни на что не влияет, оно по-прежнему показывает новости, отфильтрованные по первому тегу). Так что, похоже, что-то пошло не так с кешем, но я не могу понять, что. Для меня категории и теги выглядят практически одинаково, единственное отличие - другой параметр, но realURL должен справиться с этим.
2 ответа
Попробуй это:
plugin.tx_mytemplate = TEXT
plugin.tx_mytemplate {
stdWrap.cache.key = mytaglist
stdWrap.cache.lifetime = unlimited
stdWrap.append = CONTENT
stdWrap.append {
# ... your TS
}
}
Первое, что вы можете сделать, это кэшировать все элементы, которые являются общими для всех страниц. Хорошими кандидатами для этого являются элементы верхнего и нижнего колонтитула, а в вашем случае может быть список тегов. Если у вас есть заголовок с typoscript, вы можете использовать свойство "cache" stdWrap.
5 = TEXT
5 {
stdWrap.cache.key = someHash
}
Прочитайте документы здесь: http://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Cache/Index.html
Если вы используете эту конструкцию, то этот элемент отображается при попадании первой страницы. Затем для всех следующих страниц, когда TYPO3 должен визуализировать этот элемент, он использует значение из кэша.
Если вы думаете, что не можете использовать его для меню, потому что у вас есть состояния, такие как "активный"/"текущий", то вы ошибаетесь. Вы можете установить staes, используя Javascript. Вот пример.
var urlSplitted = window.location.pathname.substring(1).split('/');
var urlToCheck = [];
$.each(urlSplitted, function (index, value) {
if (value.length) {
urlToCheck.push(value);
$('#main-nav a').filter(function () {
var match = '^/' + urlToCheck.join('/') + '/$';
if ($(this).attr('href') != undefined) {
return $(this).attr('href').match(new RegExp(match, "i"));
} else {
return false;
}
}).parent().addClass('current');
}
})
Если вы используете Fluid, вы также можете использовать такое кэширование общего элемента. Установите ext: vhs и затем используйте этот ViewHelper https://fluidtypo3.org/viewhelpers/vhs/1.1.0/Render/CacheViewHelper.html