我正在开发一个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来确定是否应该禁用缓存。
我知道我做错了什么,我只是不知道是什么。任何帮助都会被认可:)
答案 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条件。这样就可以防止在条件满足时生成缓存条目,但保留每个其他请求的完整缓存和缓存输出。
请注意,仍然建议您创建不得缓存的页面部分,作为config.no_cache = 1
个对象。在某些情况下,您需要禁用整个页面缓存的用例表明可能存在对缓存框架和/或USER_INT
如何工作的误解。希望上面解释一下这些部分。
答案 2 :(得分:0)
如果您将此对象创建为USER_INT,则它将在主页面呈现之外呈现为非缓存。 https://docs.typo3.org/typo3cms/TyposcriptReference/ContentObjects/UserAndUserInt/Index.html