在USER_INT函数中禁用TYPO3中的缓存

时间:2017-08-18 14:22:28

标签: php caching typo3

我正在开发一个TYPO3项目,我必须根据条件动态禁用缓存。这是一个非常具体的用例,不会发生太多。

我计划使用USER_INT函数,在那里我会执行检查并在必要时禁用缓存。 USER_INT函数完美运行,每次加载页面时都会调用它。

问题是,我无法禁用缓存,或者至少我不知道如何。

代码,我现在有:

page = PAGE
page {
    typeNum = 0
    adminPanelStyles = 0
    11 = USER_INT
    11.userFunc = [COMPANY_NAMESPACE]\PageHandler->checkCache

在我执行检查的功能中:

public function checkCache($content,$conf){
    global $TSFE; 

    $id = $TSFE->id;

    if($this->checkIfDisableCache($id)){
        //$TSFE->set_no_cache(); // <---- first I tried this one
        $TSFE->no_cache=true; // <-----after a while I got despoerate and tried to disable it directly
    }
}

我也尝试使用配置,它没有用。 有趣的是,如果我直接在typoscript中设置它:

config.no_cache = 1

它可以工作,但由于检查相当复杂,我想使用PHP来确定是否应该禁用缓存。

我知道我做错了什么,我只是不知道是什么。任何帮助都会被认可:)

3 个答案:

答案 0 :(得分:1)

如果查看pibase(AbstractPlugin)代码,您会发现可能需要设置$conf['useCacheHash']$conf['no_cache']

https://api.typo3.org/typo3cms/current/html/_abstract_plugin_8php_source.html#l00190

答案 1 :(得分:1)

我不认为以前的答案中的任何一个都可以解释这种情况。这里有一个catch-22,因为在生成页面缓存条目后执行hex_esc_seq --> "\x" hex_digit { hex_digit } "\". 。它在内部工作的方式是首先可以缓存的所有内容,然后每个USER_INT输出HTML源代码中的标记,然后再替换它。这样,缓存可以包含带标记的版本,并且可以在不必渲染整个页面的情况下渲染这些标记。

因此,如果您希望仅在某些条件下禁用页面缓存,则需要执行的操作是使用仅在特殊情况下才能设置USER_INT的自定义TypoScript条件。这样就可以防止在条件满足时生成缓存条目,但保留每个其他请求的完整缓存和缓存输出。

https://docs.typo3.org/typo3cms/TyposcriptSyntaxReference/TypoScriptParserApi/CustomConditions/Index.html

请注意,仍然建议您创建不得缓存的页面部分,作为config.no_cache = 1个对象。在某些情况下,您需要禁用整个页面缓存的用例表明可能存在对缓存框架和/或USER_INT如何工作的误解。希望上面解释一下这些部分。

答案 2 :(得分:0)

如果您将此对象创建为USER_INT,则它将在主页面呈现之外呈现为非缓存。 https://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/UserAndUserInt/Index.html