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


Use a cached version of a php page unless the database has changed

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

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

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

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

[注意:对此处使用缓存库不感兴趣。我现在想学习如何在直接的PHP中做到这一点。

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

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

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

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

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

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

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

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

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

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

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

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

我的解决方案:-

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