PHP 格式的 5 分钟文件缓存
我有一个非常简单的问题:在PHP中下载文件的最佳方法是什么,但前提是本地版本已下载超过5分钟?
在我的实际案例中,我想从远程托管的csv文件中获取数据,我目前使用该文件
$file = file_get_contents($url);
没有任何本地副本或缓存。将其转换为缓存版本的最简单方法是什么,其中最终结果不会改变($file保持不变),但是如果它在不久前(例如5分钟)被获取,它将使用本地副本?
我有一个非常简单的问题:在PHP中下载文件的最佳方法是什么,但前提是本地版本已下载超过5分钟?
在我的实际案例中,我想从远程托管的csv文件中获取数据,我目前使用该文件
$file = file_get_contents($url);
没有任何本地副本或缓存。将其转换为缓存版本的最简单方法是什么,其中最终结果不会改变($file保持不变),但是如果它在不久前(例如5分钟)被获取,它将使用本地副本?
使用本地缓存文件,并在使用之前检查文件的存在和修改时间。例如,if 是本地缓存文件名:$cache_file
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);
}
(未经测试,但基于我目前使用的代码。
无论哪种方式,通过此代码,$file最终都会成为您需要的数据,并且它将使用缓存(如果它是最新的),或者从远程服务器获取数据并在没有时刷新缓存。
编辑:自从我写了上面的内容以来,我对文件锁定有了更多的了解。如果您担心此处的文件锁定,则可能值得阅读此答案。
如果你担心锁定和并发访问,我会说最干净的解决方案是file_put_contents到一个临时文件,然后重命名()
它,这应该是一个原子操作,即要么是旧内容,要么是完整的新内容,永远不会中途写入。$cache_file
$cache_file
试试phpFastCache,它支持文件缓存,你不需要编写缓存类代码。
下面是一个示例:
<?php
// change files to memcached, wincache, xcache, apc, files, sqlite
$cache = phpFastCache("files");
$content = $cache->get($url);
if($content == null) {
$content = file_get_contents($url);
// 300 = 5 minutes
$cache->set($url, $content, 300);
}
// use ur $content here
echo $content;