首页 文章

TYPO3 6.2性能,Typoscript Select,Typoscript Cache

提问于
浏览
0

The problem itself is solved, but the question is still open cause I want to test the tipps from Krystian. See Edit 3 at the bottom of this question.

我有一个非常慢的TYPO3项目 . 所以我做了一些测试,发现了一些问题 .

我测试了startpage,startpage容器2新闻列表(共9篇文章)(tx_news版本2.3.0 - 不是最新版本) . 它包含菜单(使用流体v:page.menu创建),页脚(也使用v:page.menu创建),右列(主要是图像内容元素,从带有typoscript的其他页面收集)和新闻标签列表(用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-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秒 . 所以我不明白的另一点是,为什么创建这个typoscript-object这么昂贵?是用于创建所有1303链接的typolink吗? (我用过realURL)

此外,此标记列表不会经常更改,是否可以以某种方式完全缓存它?例如,只有在执行Flush常规缓存(或前端cahches)时才创建新的标记列表?

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

Edit: 我测试了没有typolink的标签列表,它的速度提高了大约1秒 . 这意味着要创建一个典型链接1303链接成本大约1s .

Edit 2: 我发现了隐藏的 config.no_cache = 1 并且如果在启用缓存时一切正常,则立即进行测试 . 但无论如何,我很有兴趣为什么typolink如此昂贵 .

.

编辑3:我测试Krystians答案:

使用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 的代码时,标签列表仍然显示(而不是"test") . 文件说: 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 中的一个?

Edit 4: 启用缓存后,我发现新闻插件存在问题 . 我使用realURL作为newsplugin:

'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 回答

  • 0

    试试看:

    plugin.tx_mytemplate = TEXT
    plugin.tx_mytemplate {
      stdWrap.cache.key = mytaglist
      stdWrap.cache.lifetime = unlimited
      stdWrap.append = CONTENT
      stdWrap.append {
        # ... your TS
      }
    }
    
  • -1

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

    5 = TEXT
    5 {
      stdWrap.cache.key = someHash
    }
    

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

    如果使用此构造,则此元素将在首页上显示 . 然后对于TYPO3需要渲染此元素的所有下一页,它使用缓存中的值 .

    如果您认为不能将它用于菜单,因为您有“活动”/“当前”状态,那么您就错了 . 您可以使用Javascript设置staes . 这里的例子 .

    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

相关问题