if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 60 * 5 ))) {
// Cache file is less than five minutes old.
// Don't bother refreshing, just use the file as-is.
$file = file_get_contents($cache_file);
} else {
// Our cache is out-of-date, so load the data from our remote server,
// and also save it over our cache for next time.
$file = file_get_contents($url);
file_put_contents($cache_file, $file, LOCK_EX);
}
$time = filetime($local_cache)
if ($time == false || (now() - $time) > 300000)
fetch_localcache($url) #You have to do it yourself
$file = fopen($local_cache)
9条答案
按热度按时间h7appiyu1#
使用本地缓存文件,在使用前检查文件是否存在以及修改时间即可,例如:
$cache_file
为本地缓存文件名:(未经测试,但基于我目前使用的代码。)
无论使用哪种方法,$file最终都是您需要的数据,如果缓存是最新的,它将使用该高速缓存,如果缓存不是最新的,它将从远程服务器获取数据并刷新缓存。
编辑:自从我写了上面的文章之后,我对文件锁定有了更多的了解。如果你关心这里的文件锁定,读一读this answer可能是值得的。
如果您关心锁定和并发访问,我会说最干净的解决方案是将file_put_contents放到一个 temporary 文件,然后通过
$cache_file
执行rename()
,这应该是一个原子操作,即$cache_file
要么是旧内容,要么是完整的新内容,永远不会写一半。zbq4xfa02#
试试phpFastCache,它支持文件缓存,而且你不需要编写缓存类。易于在共享主机和VPS上使用
以下是示例:
ygya80vv3#
这是一个简单的版本,它也会传递一个windows
User-Agent
字符串到远程主机,这样你就不会看起来像一个没有正确报头的麻烦制造者。siv3szwd4#
如果您使用的是任何类型的数据库系统,则可以在其中高速缓存此文件。请为高速缓存的信息创建一个表,并至少为其给予以下字段:
现在,当您下次运行上面的脚本时,首先在数据库中检查标识符,并提取时间戳。如果当前时间和存储的时间戳之间的差异大于5分钟,则从URL提取并更新数据库。否则,从数据库加载文件。
如果您没有数据库设置,您可以只使用文件来做同样的事情,其中一个文件或文件中的字段将包含您上次下载文件时的时间戳。
mwngjboj5#
首先,您可能需要检查设计模式:Lazy loading .
实现应该改变为总是从本地缓存加载文件。如果本地缓存不存在或文件时间抖动超过5分钟,则从服务器获取文件。
伪码如下:
zujrkrfu6#
最佳做法
djp7away7#
您可以在第一次点击时保存文件的副本,然后使用filemtime检查后续点击时本地文件最后一次修改的时间戳。
vcudknz38#
你可以把它扭曲成一个类似缓存的方法:
siv3szwd9#
我认为您需要一些(伪代码)逻辑,例如: