TYPO3 6.2 性能、Typoscript 选择、Typoscript 缓存

Posted

技术标签:

【中文标题】TYPO3 6.2 性能、Typoscript 选择、Typoscript 缓存【英文标题】:TYPO3 6.2 performance, Typoscript Select, Typoscript Cache 【发布时间】:2015-06-10 13:33:17 【问题描述】:

问题本身已解决,但问题仍然悬而未决,因为我想测试 Krystian 的提示。请参阅此问题底部的编辑 3。

我有一个非常慢的 TYPO3 项目。于是我做了一些测试,发现了一些问题。

我测试了起始页,起始页容器 2 个新闻列表(共 9 篇文章)(tx_news 版本 2.3.0 - 不是最新的)。它包含菜单(使用流体 v:page.menu 创建)、页脚(也使用 v:page.menu 创建)、右栏(主要是图像内容元素,从另一个带有印刷文字的页面收集)和一个新闻标签列表(用打字稿创建)。新闻标签列表被使用了两次——一次在菜单中,一次在右栏中。

首先是性能概述:

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 个标签)。这是生成 taglist 的 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-object并且不需要第二次创建它。我在这里遗漏了什么吗?

这是 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 秒。所以我不明白的另一点是,为什么创建这个打字稿对象如此昂贵?是用于创建所有 1303 链接的错字链接吗? (我用的是realURL)

另外,这个 taglist 不经常改变,是否有可能完全缓存它?例如,仅在执行 Flush 通用缓存(或前端缓存)时创建一个新的 taglist?

还有其他想法吗? (我知道我可以在页面加载后通过 ajax 加载 taglist,但这只是最后的解决方法,也许有更好的解决方案)

编辑:我测试了没有错字链接的标签列表,它的速度大约快了 1 秒。这意味着为 1303 链接创建错字链接大约需要 1 秒。

编辑 2: 我发现了一个隐藏的 config.no_cache = 1 并立即测试启用缓存后是否一切正常。但无论如何,我很感兴趣为什么打字链接这么贵。

.

编辑 3: 我测试克里斯蒂安的答案:

使用stdWrap.cache.key = someHash 缓存 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>
        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 cachesflush general caches 一起使用时,仍然显示标记列表(而不是“测试”)。文档说:The cache behind this ViewHelper is the Extbase object cache, which is cleared when you clear the page content cache.。页面内容缓存到底是什么?不是flush frontend cachesflush 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 应该处理。

【问题讨论】:

您如何衡量性能?执行请求时您是否在后端登录? TYPO3 在您登录时处理请求的方式不同。 @Jost 是的,我已登录。感谢您的提示,我将在几分钟后通过注销重做测试。 @Jost 我在隐身窗口中进行了相同的测试,没有太大区别。此外,我只计算初始请求,而不是所有其他请求,如图像、css、ajax 调用。所以问题是一样的,为什么这个typoscript taglist 对象这么贵? typolink itself is very expensive。要使 realurl 工作,您必须将参数添加到 chash,否则 TYPO3 不知道您想要一个不同的页面,而只是使用缓存的页面。 @pgampe 我在 realURL“问题”中不明白的是,category 有效且未被缓存。但是tag - 看起来它与类别非常相似 - 不起作用。我找不到区别。 + add the parameters to the chash 是什么意思? 【参考方案1】:

试试看:

plugin.tx_mytemplate = TEXT
plugin.tx_mytemplate 
  stdWrap.cache.key = mytaglist
  stdWrap.cache.lifetime = unlimited
  stdWrap.append = CONTENT
  stdWrap.append 
    # ... your TS
  

【讨论】:

【参考方案2】:

您可以做的第一件事是缓存所有页面共有的所有元素。好的候选者是页眉和页脚元素,在您的情况下可能是标签列表。如果你用打字稿完成了标题,那么你可以使用 stdWrap 的“缓存”属性。

5 = TEXT
5 
  stdWrap.cache.key = someHash

在此处阅读文档:http://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Cache/Index.html

如果你使用这种结构,那么这个元素会在第一个页面点击时呈现。然后对于所有下一页,当 TYPO3 需要渲染此元素时,它使用缓存中的值。

如果你认为你不能将它用于菜单,因为你有像“活动”/“当前”这样的状态,那你就错了。您可以使用 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

【讨论】:

感谢您提供这么好的信息。我现在做一些测试并尝试缓存标签列表。为此,我在上面的打字稿中的最后一个wrap = &lt;ul&gt;|&lt;/ul&gt; 之后添加了stdWrap.cache.key = mytaglist。但是现在列表似乎没有被缓存,加载时间并没有减少。 我编辑了我的问题以显示我到目前为止测试过的内容。 这是行不通的,因为stdWrap.cache 是在内容生成之后进行评估的。您需要将.cache 属性至少提高一级并使用stdWrap.append 作为您真正的cObject,以便在生成内容之前让stdWrap 发挥作用。

以上是关于TYPO3 6.2 性能、Typoscript 选择、Typoscript 缓存的主要内容,如果未能解决你的问题,请参考以下文章

在 TYPO3 CMS 中调试 Typoscript 的最佳方法是啥?

typescript Typo3:本年度的Typoscript版权

通过Typoscript将翻译添加到TYPO3 Extension

Typoscript 的 TYPO3 问题和访问 $this->settings

TYPO3 10.4 前端未找到新字段

TYPO3 表格:无法验证 HMAC