在我们网站上显示图片时,我们使用 file_exists()
来检查文件是否存在。如果文件不存在,我们将使用一个虚拟图片。
然而,分析表明这是生成我们的页面最慢的部分之一,file_exists()
每个文件需要 1/2 毫秒 的时间。虽然我们只测试了大约40个文件,但这仍然使页面加载时间增加了20毫秒。
有谁能想出一种更快的方法吗? 是否有更好的方法来测试文件是否存在?如果我建立一个缓存,如何保持它同步。
在我们网站上显示图片时,我们使用 file_exists()
来检查文件是否存在。如果文件不存在,我们将使用一个虚拟图片。
然而,分析表明这是生成我们的页面最慢的部分之一,file_exists()
每个文件需要 1/2 毫秒 的时间。虽然我们只测试了大约40个文件,但这仍然使页面加载时间增加了20毫秒。
有谁能想出一种更快的方法吗? 是否有更好的方法来测试文件是否存在?如果我建立一个缓存,如何保持它同步。
file_exist
,因为涉及到磁盘性能。根据需要进行检查。if(!@GetImageSize($image_path_or_url)) // False means no imagefile
{
// Do something
}
它们都在同一个目录下吗?如果是的话,获取文件列表并将其存储在哈希表中进行比较可能比进行所有file_exists查找更值得。
我来到这个页面寻找解决方案,看起来fopen可能是个好办法。如果你使用这段代码,你可能想要禁用未找到文件的错误日志记录。
<?php
for ($n=1;$n<100;$n++){
clearstatcache();
$h=@fopen("files.php","r");
if ($h){
echo "F";
fclose($h);
}else{
echo "N";
}
}
?>
那么 glob()
呢?但我不确定它是否快速。
我认为每次调用1/2毫秒非常非常实惠。我认为没有更快的替代方案,因为文件函数非常接近处理文件操作的底层。
但是,您可以编写一个包装器来缓存file_exists()的结果到memcache或类似的设施中。这应该会在日常使用中将时间减少到几乎为零。
你可以使用cronjob定期创建图像列表并将它们存储在DB/file/BDB/...中。
每半个小时应该足够了,但一定要创建一个接口来重置缓存以防文件添加/删除。
然后,在shell上运行find . -mmin -30 -print0也很容易,并添加新文件。
我认为最好的方法是将图片URL保存在数据库中,然后将其放入会话变量中,特别是在进行身份验证时。这样你就不必每次重新加载页面时都进行检查。
当您将文件保存到文件夹中时,如果上传成功,您可以将路径存储到数据库表中。
然后,您只需查询数据库以查找所请求文件的路径。
我甚至不确定这样做是否会更快,但看起来你仍然想要进行基准测试:
构建一个大型图像路径数组的缓存。
$array = array('/path/to/file.jpg' => true, '/path/to/file2.gif' => true);
根据您的需求,每小时或每天使用cron运行PHP脚本更新缓存。该脚本将递归遍历文件目录以生成路径数组。
当您希望检查文件是否存在时,请加载缓存数组并进行简单的isset()检查,以进行快速的数组索引查找:
if (isset($myCachedArray[$imgpath])) {
// handle display
}
仍会有加载缓存的开销,但希望足够小以保持在内存中。如果您在页面上检查多个图像,则可能会注意到更显着的增益,因为您可以在页面加载时加载缓存。