突然想到一个奇怪的问题,想和大家讨论一下。
file_exists 的查找速度如何?下面是我测试搜索temp临时文件夹1103个文件<?php
$mtime = explode(" ",microtime());
$starttime = $mtime[1] + $mtime[0];
$filename = 'Temp/_723415456_.png';
if (file_exists($filename)) {
    echo "exists";   // exists
} else {
    echo "not exist";
}
echo '<br />'.memory_get_usage().'<br />'; // 108912b 内存
$mtime = explode(" ",microtime());
$endtime = $mtime[1] + $mtime[0];
$totaltime = ($endtime - $starttime);
echo "load ".$totaltime." s"; // 0.000925064086914 s 
?> 光测试1000个文件,查询速度非常快。但是如果有100W个文件呢?查询速度会不会变慢,内存占有率会不会变大?
(100W个文件可以分配到100个不同的文件夹,然后将文件夹名列为数组。)

解决方案 »

  1.   

    文件目录深度就2级,temp/(数字1-100),仅仅判断文件是否存。理论上速度应该不慢的吧~?
      

  2.   

    楼主你要清楚既然是分文件夹了,那么一般都是在查询文件之前就已经确定要查哪个文件夹了,而不是一下查100w个,要是那样啥服务器也解决不了,楼主也可以试一试is_file来比一比速度看看那个方法较快,不过貌似以前有个帖子说是is_file较快,不过没试过
      

  3.   

    我笔头不好,这个就算了。的确,现在有2种思路。
    一种还是用数字分文件夹,只是先将数据的记录位置保存到一些JSON文档里,先搜索json文件,确定文件在哪个文件夹里,然后在搜索那个文件夹,打开文件;一种按字母分文件夹,文件按首字母归类(或首2个字母),explore文件名,搜索指定的文件夹,打开文件。
    2种方法都不需要遍历所有的100W文件,没测试过,估计速度应该不超过1秒。这种简陋的方法,把数据全都用json方式 记录到txt文档,可以在某些领域,替代MYSQL了吧,尤其是用在某些不带数据库的虚拟服务器上。
      

  4.   

    如果是完整的路径+文件名,决定效率应该不在php而在系统如果是模糊查询那就麻烦了……呵呵
      

  5.   


    是完整路径+文件名。
    有一点想搞明白,如果遍历100W个文件,速度是像MYSQL一样,很快?还是像WINDOWS自带的文件查询一样,很慢?
      

  6.   

    PHP最后是不是调用系统API来操作查询的?这个有高人出来描述一下 或者看看源码,我觉得应该是的,所以跟WIN应该是一样
      

  7.   

    肯定的.
    linux下是直接调用C标准库的access函数,原型大概是
    access(char *pathname,int mode/*0-是否存在,2-写,4-读,6-执行*/)
    win32下会调用tsrm_win32_access,过程会复杂些.
      

  8.   

    高人终于浮现了,linux应该比WIN更有优势。