TYPO3 6.2性能,Typoscript Select,Typoscript Cache

时间:2015-06-10 13:33:17

标签: typo3 typoscript typo3-6.2.x tx-news

问题本身已经解决,但问题仍然存在,因为我想测试克里斯蒂安的tipps。请参阅此问题底部的编辑3。

我有一个非常慢的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加载标记列表,但这只是最后的解决方案,也许有更好的解决方案)

编辑我在没有typolink的情况下测试了标记列表,并且它的速度提高了大约1秒。这意味着要创建一个典型链接,以便1303 Link的成本大约为1s。

编辑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 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 cachesflush general caches中的一个?

编辑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 :(得分:0)

试试:

        Console.WriteLine("Name a color");
        string color = Console.ReadLine();

        ConsoleColor consoleColor = ConsoleColor.White;
        try
        {
            consoleColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), color, true);
        }
        catch (Exception)
        {
            //Invalid color
        }

        Console.ForegroundColor = consoleColor ;

答案 1 :(得分:-1)

您可以做的第一件事是缓存所有页面共有的所有元素。好的候选者是页眉和页脚元素,在你的情况下可能是标签列表。如果您使用typoscript完成标题,那么您可以使用&#34; cache&#34; stdWrap的财产。

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

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

如果您使用此构造,则此元素将在首页点击时呈现。然后,对于TYPO3需要渲染此元素的所有下一页,它将使用缓存中的值。

如果你认为你不能将它用于菜单,因为你有像#34; active&#34; /&#34; current&#34;那你错了。您可以使用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