0

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

我不明白的是,如果页面上有可折叠的固定菜单,你会怎么做。因此,一个站点有一个可以折叠的固定顶部菜单,并且它的状态通过 cookie 来记忆。如果页面被缓存,那么它无疑会忽略折叠顶部菜单的实际状态。

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

此外,该站点是响应式的,用户代理检测决定了向哪些设备提供 jQuery 功能(其他设备获得基本的回退)。

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

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

4

1 回答 1

1

在缓存方面,您有很多选择,并且各有利弊:

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

关于您的响应式网站:也许使用 javascript 实现后备和东西将是要走的路。这样,客户端将完成所有工作,而您的服务器可以提供更静态的页面,该页面可以很好地缓存。

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

于 2013-05-05T13:34:33.913 回答