Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非数据库已更改,否则请使用php页面的缓存版本_Php_Database_Caching_Http Headers_Etag - Fatal编程技术网

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

除非数据库已更改,否则请使用php页面的缓存版本,php,database,caching,http-headers,etag,Php,Database,Caching,Http Headers,Etag,我已经研究过关于PHP中缓存的类似问题,但我仍然不知道如何在不重新调用数据库的情况下检查数据库是否已更改,这将破坏缓存的意义 我从技术上理解如何在PHP中实现缓存——使用ETag和上次修改的标题、输出缓冲、存储静态文件等等。让我困惑的是如何确定何时提供页面的新版本而不是缓存版本。如果数据库内容已更改,我希望显示新版本,而不是缓存版本 例如,假设我有一个显示产品详细信息的页面。一般来说,一旦产品信息存储在数据库中,它就不会有太大的变化。但有时可能会对产品说明进行编辑或更改价格。如果产品有新的价格,

我已经研究过关于PHP中缓存的类似问题,但我仍然不知道如何在不重新调用数据库的情况下检查数据库是否已更改,这将破坏缓存的意义

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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

我的解决方案:-


每次创建或更新新列表时,我都会取消缓存文件的链接,然后在index.php页面上检查缓存文件是否存在加载缓存或从数据库加载内容,同时将此数据写入缓存文件,以便下次当用户请求index.php文件时,推而不是拉:如果数据库更改,缓存已更新/无效。Gumbo,谢谢。当管理员用户在我的应用程序中更新产品记录时,我正在考虑更新与缓存相关的文件(内容本身或etag值)。当然,这并不能说明何时直接更新数据库,但这可能不是必需的。我可以使用cron,但这与缓存版本在一段时间后过期的问题类似——它要么更新得太频繁,要么不必要,或表示实际数据库更新与文件更新之间的延迟时间。您可以使用一些更新频率试探法或更新优先级排序,类似于用于确定缓存版本何时失效的方法。感谢您的详细回复。正如我在问题中提到的,我了解缓存的不同方式——客户端和服务器端。我也不是在寻找像memcached这样的外部工具。我的问题是如何有效地检查数据库信息是否是最新的,而不需要对数据库进行太多的调用。