0

问题本身已解决,但问题仍然悬而未决,因为我想测试来自 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 个标签)。这是生成标签列表的 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)

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

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

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

编辑 2:我现在发现了一个隐藏的config.no_cache = 1和测试,如果启用缓存时一切正常。但无论如何,我很感兴趣为什么打字链接如此昂贵。

.

编辑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"and一起使用时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 应该处理。

4

2 回答 2

0

试试看:

plugin.tx_mytemplate = TEXT
plugin.tx_mytemplate {
  stdWrap.cache.key = mytaglist
  stdWrap.cache.lifetime = unlimited
  stdWrap.append = CONTENT
  stdWrap.append {
    # ... your TS
  }
}
于 2015-06-12T09:02:55.940 回答
-1

您可以做的第一件事是缓存所有页面共有的所有元素。好的候选者是页眉和页脚元素,在您的情况下可能是标签列表。如果你用打字稿完成了标题,那么你可以使用 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

于 2015-06-10T20:01:14.760 回答