我正在用PHP编写缓存模块。它尝试使用$string+timestamp
作为文件名编写缓存。
我写缓存没有问题。
问题是,我做了一个foreach循环来获取我想要的缓存。
这是我用来获取缓存的逻辑:
foreach ($filenames as $filename){
if(strstr($filename,$cachename)){//if found
if(check_timestamp($filename,time()))
display_cace($filename);
break;
}
}
但是当它试图获取和读取缓存时,它会降低服务器速度。想象一下,我在一个文件夹中有10000个缓存文件,我需要检查该缓存文件夹中的每个文件。
换句话说,我用这种格式filename_timestamp
编写缓存文件。例如:cache_function_random_news_191982899010
在./cache/
文件夹中。
当我想获取缓存时,我只传递cache_function_random_news_
并以递归方式检查该文件夹。
如果我在文件名上找到带有该针的东西,则显示它并中断。
但是递归检查文件夹中的10000个文件并不是件好事,对吧?
这样做的最佳方式是什么?
答案 0 :(得分:2)
浏览器和Web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制文件/文本)或数据库中维护此索引。
例如:
这种方法将大大提高性能。
答案 1 :(得分:1)
不要将时间戳存储为文件名的一部分,而是以某种对您有意义的格式将缓存内容与缓存内容一起存储在文件中。例如:
档案/cache/cache_function_random_news
:
191982899010
stored content
文件的第一行包含时间戳,您可以在需要时阅读该时间戳,例如:定期清理缓存时该文件的其余部分包含缓存的内容。另一种可能性是使用序列化数组。无论哪种方式,这使得读取缓存变得微不足道:
if (file_exists('cache/cache_function_random_news')) ...
答案 2 :(得分:0)
function rpl_cache_get($cachename, $time=''){
$ci=&get_instance();
$ci->load->helper('directory');
//getting the file in cache folder.
if(is_file(BASEPATH.'cache/'.$cachename)){
//current time is less then the time cache expire
//get the data.
$f = fopen(BASEPATH.'cache/'.$cachename,"r");
$content = fread($f,filesize(BASEPATH.'cache/'.$cachename));
if ( ! preg_match("/(\d+TS--->)/", $content, $match))
{
return FALSE;
}
// Has the file expired? If so we'll delete it.
if (time() >= trim(str_replace('TS--->', '', $match['1'])))
{
@unlink(BASEPATH.'cache/'.$cachename);
log_message('debug', "Cache file has expired. File deleted");
return FALSE;
}
$content = str_replace($match['0'], '', $content);
fclose($f);
return unserialize($content);
}
return false;
}
这个缓存系统将html块保存到php序列化数组中。然后使用上面的函数读取它并反序列化它并返回htmls数组。 你只需要使用echo或print_r
显示它们function rpl_cache_write(&$data,$name,$timelimit){
$timesecond = $timelimit * 60;
$cache_timestamp = time() + $timesecond;
$f = fopen(BASEPATH.'cache/'.$name,"w");
if($f != FALSE){
$content = $cache_timestamp.'TS--->'.serialize($data);
fwrite($f,$content,strlen($content));
fclose($f);
return true;
} else {
//todo : throw error cannot write cache file
//echo "cannot write cache";
}
return false;
}