除非数据库已更改,否则请使用php页面的缓存版本

时间:2012-05-23 18:22:17

标签: php database caching http-headers etag

我已经查看了有关PHP缓存的类似问题,我仍然难以理解如何在不对数据库进行新调用的情况下检查数据库是否已更改,这将破坏缓存点。

我从技术上理解如何在PHP中实现缓存 - 使用ETag和Last Modified标头,输出缓冲,存储静态文件等。让我沮丧的是如何确定何时提供服务新版本的页面而不是缓存版本。如果数据库内容已更改,我想显示新版本而不是缓存版本。

例如,假设我有一个页面显示有关产品的详细信息。通常,一旦产品信息存储在数据库中,它就不会有太大变化。但有时可能会对产品说明或价格变动进行编辑。如果产品有新价格,我不想通过使用页面的缓存版本向用户显示旧价格。因此,每小时更新缓存的内容似乎不够。更不用说对于没有改变的内容而言,这种情况经常发生,真正的问题是,当发生变化时,它不会足够快地更新内容。

每次通过应用程序管理区域中的表单更新产品数据库时,我应该存储一些东西(例如,ETag值或静态html文件)吗?我在这里缺少什么?

[注意:对此处使用缓存库不感兴趣。我现在想学习如何在PHP中学习它。]

2 个答案:

答案 0 :(得分:1)

缓存是一个非常复杂的主题,因为您可以在各个位置缓存所有类型的数据。通常,您实现缓存以缓解服务器结构中的瓶颈。

在您的设置中,您可以在三个不同的位置缓存数据:

1)客户端和服务器之间的客户端 您可以使用此方法来节省带宽并缩短用户的加载时间。您可以通过将缓存相关字段设置为http标头(Cache-Control,Expires,ETag等)来实现此目的。

如果您使用Cache-Control或Expires,则决定从服务器加载更新版本或不完全取决于客户端。因此,即使有新版本可用,用户也不会看到它。从好的方面来说,你在服务器上节省了大量的cpu周期,因为你的php脚本不会被执行。

如果您使用ETag,您可以在每个请求中通知客户端,如果所请求内容的版本已更改。但是你的php脚本将在每个请求上执行,即使ETag没有改变。

2)客户端和服务器之间的Serverside 这种缓存主要减少服务器上的高CPU负载。它不会影响客户端和服务器之间生成的流量。

您可以使用Varnish等客户端代理在服务器端存储呈现的响应。好消息是,您可以完全控制缓存。如果所请求内容的更新版本可用,您只需从缓存中清除旧版本,以便从您的php脚本生成新版本并存储在缓存中。

每个可缓存的响应只会生成一次,然后从缓存提供给客户端。

3)在您的申请中 如果您大量使用数据库,则应考虑使用memcached等快速键值存储来缓存查询结果。当然你必须为此调整数据库类(首先询问memcached,如果memcached没有结果请求数据库并将结果存储到memcached中),但性能提升将非常令人印象深刻,因为memcached非常快。

如果数据不必永久保存(例如php会话),有时甚至将数据存储在memcached中也是有意义的。

答案 1 :(得分:0)

我早就遇到了同样的问题(我不知道你是否会找到正确的方法)。

为什么我需要缓存: - 我的网站使用的是,它用于通过在cron.php文件上运行脚本来更新数据库,而index.php用于显示数据库中的列表(这用于加载年龄)

我的解决方案: -

每次创建或更新新列表时我取消链接缓存文件然后在index.php页面上我检查缓存文件是否存在加载缓存还是从数据库加载内容同时也将此数据写入缓存文件所以下次用户请求index.php文件时