在核心php中读取1000多个txt文件

时间:2019-03-20 09:30:35

标签: php fopen

我有1000多个txt文件,文件名用作用户名。现在,我正在使用循环阅读它。这是我的代码

for($i=0; $i<1240; $i++){                       
    $node=$users_array[$i];                     
    $read_file="Uploads/".$node."/".$node.".txt";                                
    if (file_exists($read_file)) {

        if(filesize($read_file) > 0){       
            $myfile = fopen($read_file, "r");                           
            $file_str =fread($myfile,filesize($read_file));                         
            fclose($myfile);  
        }
    }
}

当循环运行时,它花费了太多时间,并且服务器超时。

我不知道为什么要花费这么多时间,因为文件中没有太多数据。从txt文件读取所有文本应该很快。我对吗?

2 个答案:

答案 0 :(得分:0)

好吧,您正在HDD / SSD上执行读取操作,但其读取速度不及内存,因此取决于文本文件的大小,您应该期望较长的运行时间。您可以尝试以下操作:

  • 如果您是从浏览器运行脚本,建议从命令行运行,这样就不会使Web服务器超时,并且如果在php上没有设置时间执行限制,脚本将设法完成。也许应该增加它
  • 在上面的脚本中,您可以将“ filesize($ read_file)”设置为变量,这样您就不必执行两次,这可能会改善脚本的运行
  • 如果您仍然无法完成工作,请考虑以100或500的批量运行它。
  • 关注内存使用情况,也许这就是脚本死掉的原因
  • 如果您需要文件内容作为字符串,则可以尝试“ file_get_contents”,也可以跳过“ filesize”一起检查

答案 1 :(得分:0)

听起来您的问题是在单个目录中有1000多个文件。在传统的Unix文件系统上,按名称查找单个文件需要逐个扫描目录条目。如果您有文件列表并尝试读取所有文件,则将需要遍历约500000个目录条目,而且速度很慢。这是一种O(n ^ 2)算法,添加文件时只会变得更糟。

较新的文件系统具有启用更有效的目录访问的选项(例如https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories),但是如果您不想/不希望更改文件系统选项,则必须将文件拆分为目录。

例如,您可以使用用户名的前两个字母并将其用作目录。这不是很好,因为您将获得不均匀的分布,最好使用散列,但是这样一来,手工查找条目将很困难。

或者,您可以迭代目录条目(使用opendir和readdir),并检查文件名是否与您的用户匹配,然后再处理庞大目录为以后创建的问题。

或者,考虑在存储层中使用数据库。