PHP在特定日期/时间段内显示目录中的文件

时间:2014-02-12 00:22:51

标签: php perl

我正在尝试找出使用PHP搜索文件目录的最佳方法,并返回日期内的文件列表。文件名带有时间戳,但使用此方法需要循环遍历每个文件以检索结果。每个文件夹有超过80,000个文件。资源很重。

PHP是否有内置函数来执行此操作或者最好这样做?

由于

编辑: 调用像perl这样的后端脚本会更高效,然后将结果返回给PHP。

2 个答案:

答案 0 :(得分:1)

这很容易做到而不消耗大量的RAM(除非你因为某些原因必须读入所有文件)。我已经多次使用过这种软件,效果很好。

使用opendir打开要检查的目录。

然后在循环中使用readdir逐个读取文件的名称。 readdir处理文件的顺序与文件系统目录对象中存储的顺序相同。这对于与您提到的目录一样大的目录很有用,因为它不会尝试对文件名进行排序。 (还有一个名为scandir的api。那个 对文件名进行排序;不要在你的多文件应用程序中使用它。)

每次调用readdir时,它都会为您提供目录中下一个文件的文件名。这是文档;这些例子很有帮助。 http://www.php.net/manual/en/function.readdir.php

拥有每个文件名后,您可以使用stat高效地查找文件的各种属性。 http://www.php.net/manual/en/function.stat.php这将告诉你有用的东西,如创建时间,长度,所有者。

如果您使用的是* nix系统(如BSD或Linux),则可以使用{{1快速将文件移动到同一文件系统上的其他目录 而不复制它}然后link。如果您只是unlink,则删除它。

这里要记住的一件事是:您应该将unlink为您提供文件名的顺序视为正式无法预测的随机。它们不保证按任何给定的顺序排列。我已经被这个抓住了,因为在我使用过的几个环境中,远程(NFS)文件系统处理的顺序与本地文件系统的处理方式不同。

答案 1 :(得分:1)

试试这个:

function getFilesByTime($folder, $from, $to, $format){
  $contents = scandir($folder); $a = array();
  foreach($contents as $f){
    if(is_file($f)){
      $ft = filemtime($f);
      if($ft >= strtotime($from) && $ft <= strtotime($to))$a[$f] = date($format, $ft);
    }
  }
  return $a;
}
print_r(getFilesByTime('wherever', '10/15/2005', 'now', 'F d, Y H:i:s'));