【问题标题】:TYPO3: how to cache just some parts in an extension pluginTYPO3:如何只缓存扩展插件中的某些部分
【发布时间】:2011-11-30 18:35:14
【问题描述】:

我有这个扩展程序显示一些客户数据和嵌入式视频 (MP4)。 它由一个缓存的插件组成,因为数据不会更改,除非 TYPO3-Backend 中有人对其进行更改并清除缓存。

我们不想使用新的 HTML5 视频标签来在没有 Flash 的 iPhone/iPad 上播放视频。为了不必为每个客户在我们的服务器上存储多个视频文件,我为 Flash 浏览器(例如 Firefox,它不会在 HTML5-Tag huray 中播放 MP4 视频)做了一个备用方法.此方法检查用户浏览器代理,并在此获取相应的视频标签(FlahsPlayer 或 HTML5)。

现在问题来了:如果我清除 TYPO3-Backend 中的缓存,然后使用 Firefox 加载插件(使用 Flash),然后如果我随后在 iPhone 上加载页面,我会使用 Flashplayer 获得缓存版本。 但是,如果我清除 TYPO3-Cache,然后用 iPhone 加载页面,那么 PC 上的 Firefox 将获得 HTML5 版本(不适用于 MP4)。

现在的问题是:是否可以只缓存插件的某些部分? 我的意思是:静态客户数据不会经常更改,因此缓存将是完美的。但是每次都应该检查 Browser-Agent/used Video-Tag。 我没有找到任何东西 - 或者我搜索了错误的方式......

【问题讨论】:

  • 为什么要在服务器端这样做?我们通常在 TYPO3 网站上使用 videojs (videojs.com) 来决定客户端提供哪个视频。这样一来,TYPO3(以及 varnish 之类的反向代理)就可以完全缓存网站。
  • 因为在这个平台上我想尽可能少地依赖javascript。

标签: html caching flash mp4 typo3


【解决方案1】:

可以更改某些扩展的渲染以允许部分渲染为非缓存。如果扩展允许使用您的自定义 stdWrap 设置更改部分(例如 tt_news 允许),这通常是可能的。不幸的是,通常情况并非如此。

另一个选项可能是大卫建议的。有两个 PAGE 对象,每个对象都定义了不同的 typeNum 和视频的扩展渲染,而 PAGE 对象不是由 TYPO3 选择的,具体取决于 &type GET 属性在网址中。

【讨论】:

  • “不幸的是,通常情况并非如此”是什么意思。 => 我不应该这样做,因为这是不好的做法?关于 TYPE-Param:如果我假设,我是否正确理解这一点,如果访问者致电 mypage.com/somepage,那么他应该首先被重定向到 mypage.com/somepage?type=2(例如,当他在 iPhone 上时),然后他会得到不同的内容?
  • 不,这句话的意思是不幸的是大多数扩展都不支持它。关于这个问题,您目前在哪里执行用户代理检测?
  • 查看我的其他答案。我刚刚意识到,对于 Typoscript 条件,您应该得到不同的结果,因为每个条件都存储了不同的缓存版本。
  • 目前我在我组装视频标签的 PHP 方法中检测到用户代理。
  • 那我建议你将检测切换到 Typoscript 条件。您可以使用内置检测[browser],或者如果需要,在条件[userFunc] 中使用自定义评估。这将为您提供 2 个缓存版本的页面。在条件中,您可以设置将为 iPhone 生成不同渲染的设置,或者您设置一些指令,以帮助您的自定义方法检测正在使用此条件完成渲染。
【解决方案2】:

您可以为用户代理检测设置 Typoscript condition 并在内部定义、重新定义任何设置,包括不同浏览器的渲染类型。 TYPO3 为每个条件创建不同的缓存版本。这实际上就是为什么过多的条件会导致缓存表的增长。

【讨论】:

    【解决方案3】:

    是的,你可以。您可以使用 type-parameter 为您的插件创建虚拟 2 个页面。然后,您可以决定 iphone 或 firefox 何时使用简单的 Typo3 条件加载页面。例如,类型参数用于当前页面的打印页面。不幸的是,这不起作用:

    page = PAGE
    page.typeNum = 1
    stuff = CASE
    stuff.key.field = typeNum
    stuff.default = TEXT
    stuff.default.value = Default
    stuff.1 = TEXT
    stuff.1.value = One
    

    我总是在浏览器窗口中获得默认文本,但我也不知道如何强制输入类型。

    【讨论】:

    • “类型参数”是什么意思?我不确定你指的是什么。
    • 看我的答案,我已经修正了我的答案。
    • 你没有这样的例子,不是吗?以前从未做过类似的事情......我的意思是结合不同的 PHP-Method-Call
    • 现在我不知道我是否理解你。你可以很容易地用谷歌搜索类型参数,如果我理解你不必担心缓存的问题,因为类型参数完全符合你的要求?
    • 类型参数本身我知道。但是请参阅我在 cascaval 帖子中的评论 - 也许你会明白我的意思
    【解决方案4】:

    非常感谢 cascaval 和 David 的帮助。

    对于任何寻找相同东西的人,这里是我最终解决它的详细代码:

    1. 通过设置和常量设置插件设置
    2. 使用定义的设置设置一些条件
    3. 实现 PHP 方法

    在 setup.txt 中:

    plugin.tx_myext_pi3_item.is_flash_browser = {$plugin.tx_myext_pi3_item.is_flash_browser}  
    

    在 constants.txt 中:

    # cat=tx_myext/Browser Capabilities/21; type=boolean; label= Browser-Agent Switch:Switch used to differentiate between flash based and HTML5 based browsers (e.g. for rendering different players).  
    plugin.tx_myext_pi3_item.is_flash_browser = 1
    

    在 TypoScript 中我设置了以下配置:

    # Default browser is assumed HTML5 capable:  
    plugin.tx_myext.is_flash_browser = 0
    
    # Browser Agent: MSIE prior to version 9.  
    [browser = msie] && [version = <9]  
      plugin.tx_myext.is_flash_browser = 1  
    [global]
    
    # Browser Agent: Firefox or Opera browser.  
    [useragent = *Firefox*] || [useragent = *Opera*]  
      plugin.tx_myext.is_flash_browser = 1  
    [global]
    
    # Browser Agent: Google Chrome prior to version 5.  
    [useragent = *Chrome*] && [version = <5]  
      plugin.tx_myext.is_flash_browser = 1  
    [global]
    
    # Browser Agent: Safari prior to version 3.  
    [useragent = *Safari*] && [version = <3]  
      plugin.tx_myext.is_flash_browser = 1  
    [global]
    
    # Browser Agent: iPhone, iPad, iPod  
    # Must be at the end to override Safari condition if necessary.  
    [useragent = *iPhone*] || [useragent = *iPod*] || [useragent = *iPad*]  
      plugin.tx_myext.is_flash_browser = 0  
    [global]
    

    最后但并非最不重要的是,在 PHP 方法中,我使用以下代码访问设置:

    if ($is_flash_browser == 1) {  
      // Here comes the flash player stuff.  
    } else {  
      // Here comes the HTML5 player stuff.  
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多