Php 查找数千个文件中是否存在动态文件名
我正在用PHP编写一个缓存模块。它尝试使用Php 查找数千个文件中是否存在动态文件名,php,codeigniter,Php,Codeigniter,我正在用PHP编写一个缓存模块。它尝试使用$string+时间戳作为文件名写入缓存 我写缓存没有问题 问题是,我执行foreach循环以获取所需的缓存 这是我用于获取缓存的逻辑: foreach ($filenames as $filename){ if(strstr($filename,$cachename)){//if found if(check_timestamp($filename,time())) dis
$string+时间戳作为文件名写入缓存
我写缓存没有问题
问题是,我执行foreach循环以获取所需的缓存
这是我用于获取缓存的逻辑:
foreach ($filenames as $filename){
if(strstr($filename,$cachename)){//if found
if(check_timestamp($filename,time()))
display_cace($filename);
break;
}
}
if (file_exists('cache/cache_function_random_news')) ...
但当它试图获取并读取缓存时,会减慢服务器的速度。假设一个文件夹中有10000个缓存文件,我需要检查该缓存文件夹中的每个文件
换句话说,我用这种格式编写缓存文件filename\u timestamp
。例如:cache\u function\u random\u news\u 191982899010
在文件夹/cache/
中
当我想要获取缓存时,我只传递cache\u函数\u random\u news\u
并递归检查该文件夹。
如果我在一个文件名上发现有针的东西,显示它,然后断开
但是递归地检查文件夹中的10000个文件不是一件好事,对吗
这样做的最佳方式是什么?浏览器和web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制/文本)或数据库中维护此索引
例如:
无论何时创建新缓存文件,都要向表/文件中添加行/条目
然后,只需使用表/文件快速搜索缓存文件是否存在
您还可以使用记录中的标志标记不必要/过时的文件
然后定期(使用Cron作业或其他技术)删除过时的缓存文件
这种方法将大大提高性能。浏览器和web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制/文本)或数据库中维护此索引
例如:
无论何时创建新缓存文件,都要向表/文件中添加行/条目
然后,只需使用表/文件快速搜索缓存文件是否存在
您还可以使用记录中的标志标记不必要/过时的文件
然后定期(使用Cron作业或其他技术)删除过时的缓存文件
这种方法将大大提高性能。不要将时间戳存储为文件名的一部分,而是将其与缓存内容一起以某种对您有意义的格式存储在文件中。例如:
文件/cache/cache\u函数\u random\u news
:
191982899010
stored content
文件的第一行包含时间戳,您可以在需要时读取该时间戳,例如定期清理缓存时。文件的其余部分包含缓存的内容。另一种可能是使用序列化数组。无论哪种方式,读取缓存都很简单:
foreach ($filenames as $filename){
if(strstr($filename,$cachename)){//if found
if(check_timestamp($filename,time()))
display_cace($filename);
break;
}
}
if (file_exists('cache/cache_function_random_news')) ...
不要将时间戳存储为文件名的一部分,而是将其与缓存内容一起以某种对您有意义的格式存储在文件中。例如:
文件/cache/cache\u函数\u random\u news
:
191982899010
stored content
文件的第一行包含时间戳,您可以在需要时读取该时间戳,例如定期清理缓存时。文件的其余部分包含缓存的内容。另一种可能是使用序列化数组。无论哪种方式,读取缓存都很简单:
foreach ($filenames as $filename){
if(strstr($filename,$cachename)){//if found
if(check_timestamp($filename,time()))
display_cace($filename);
break;
}
}
if (file_exists('cache/cache_function_random_news')) ...
这个缓存系统正在将html块保存到php序列化数组中。然后使用上面的函数读取它并取消序列化,然后返回HTML数组。
您只需要使用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;
}
这个缓存系统正在将html块保存到php序列化数组中。然后使用上面的函数读取它并取消序列化,然后返回HTML数组。
您只需要使用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;
}
是的,这也在codeigniter缓存系统上实现。我也这么做了。因为这个系统是在99%的用户完成一个应用程序后实现的,所以代码有点像黑客。它没有显著减少内存使用,但将计算时间减少到90%,因为它绕过了数据库。是的,这也在codeigniter缓存系统上实现。我也这么做了。因为这个系统是在99%的用户完成一个应用程序后实现的,所以代码有点像黑客。它没有显著减少内存使用,但将计算时间减少到90%,因为它绕过了数据库。