1

我已经查看了有关 PHP 中缓存的类似问题,但我仍然对如何检查数据库是否已更改而不对数据库进行新调用感到困惑,这会破坏缓存的意义。

我从技术上了解如何在 PHP 中实现缓存——使用 ETag 和 Last Modified 标头、输出缓冲、存储静态文件等。让我感到困惑的是如何确定何时提供新版本的页面而不是缓存版本。如果数据库内容发生了变化,我想显示新版本而不是缓存版本。

例如,假设我有一个显示产品详细信息的页面。一般来说,产品信息一旦存入数据库,就不会发生太大变化。但有时可能会对产品描述进行编辑或价格更改。如果产品有新价格,我不想通过使用页面的缓存版本向用户显示旧价格。出于这个原因,每小时更新缓存的内容似乎还不够。更不用说对于没有变化的内容来说太频繁了,真正的问题是当有变化时它不会足够快地更新内容。

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

[注意:对在这里使用缓存库不感兴趣。我现在想学习如何直接使用 PHP。]

4

2 回答 2

2

缓存是一个相当复杂的话题,因为你可以在不同的地方缓存各种数据。通常,您实施缓存以缓解服务器结构中的瓶颈。

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

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

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

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

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

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

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

3) 在您的应用程序中如果您大量使用数据库,您应该考虑使用像 memcached 这样的快速键值存储来缓存查询结果。当然你必须为此调整你的数据库类(首先询问 memcached,如果 memcached 没有结果询问数据库并将结果存储到 memcached 中),但性能提升会非常可观,因为 memcached 真的很快。

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

于 2012-05-23T20:07:23.857 回答
0

很久以前我也遇到过同样的问题(我不知道你是否会找到我的方法是正确的)。

为什么我需要缓存:- 我的网站用来做的是,它用于通过在 cron.php 文件和 index.php 上运行脚本来更新数据库,用于显示来自数据库的列表(这种使用需要很长时间才能加载)

我的解决方案:-

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

于 2013-01-20T18:28:23.233 回答