PHP缓存 - 如何处理动态菜单?

时间:2013-05-03 21:23:22

标签: php symfony

我正在掌握PHP缓存,我明白了 - 缓存整个页面以提高后续访问的性能等。

如果页面上有可折叠的固定菜单,那么我没有得到的是你如何解决这个问题。因此,网站有一个固定的顶级菜单,可以折叠,其状态记住一个cookie。如果页面被缓存,那么毫无疑问它会忽略折叠顶部菜单的实际状态。

也许,顶级菜单应该去,但我猜它可以以某种方式得到它。 PHP决定加载顶级菜单的状态(检测cookie),JS也可以更改顶级菜单(和cookie)的状态。

此外,该网站具有响应能力,用户代理检测决定向哪些设备提供jQuery功能(其他设备获得基本后备)。

显然我不能只缓存整个页面。

如果有所作为,我正在使用Symfony2。

1 个答案:

答案 0 :(得分:1)

在缓存方面,你有很多选择,而且都有其优点和缺点:

  • ESI:在您提及的评论中,您了解ESI,它可用于仅呈现页面的一部分。在您的情况下,只有渲染菜单(折叠或不基于cookie)可能是一个选项
    • Javascript:如果仅在JS中实现整个折叠并始终使用菜单传递HTML代码,则可以缓存整个页面,然后让客户端呈现折叠与否。您可以节省一些服务器端代码,使Web服务器和客户端浏览器的缓存更容易,也可以在不重新加载的情况下折叠菜单。
    • ETag:这是最复杂的选择,但它肯定有优势。您可以使用包含cookie状态的哈希创建ETag。这样,浏览器会询问最后一个ETag是否有任何变化,并根据某些cookie属性(例如折叠状态)生成ETag。如果更改,则ETag不匹配,并返回“新”页面。如果没有任何更改,则使用缓存版本。您可以在symfony文档中阅读有关ETag的内容。
    • 缓存层:您当然可以查看各种反向缓存代理。它们支持各种缓存方式,可能有一些方法可以解决您的问题。

关于您的响应式网站:也许实现后备和javascript的东西将是要走的路。通过这种方式,客户端可以完成所有工作,您的服务器可以提供一个更加静态的页面,可以非常好地缓存。

您必须记住,动态页面和缓存类型相互排斥。如果根据cookie属性,用户代理,可能是ip地址等提供不同的内容,您将遇到缓存问题。您的页面越静态(如果您提供静态页面并通过javascript添加所有动态,从Web服务器的角度来看页面是静态的),更好的缓存将起作用。这是一种权衡,你很可能不会得到所有东西(高cach命中率和高动态页面)。