我正在尝试找出使用PHP搜索文件目录的最佳方法,并返回日期内的文件列表。文件名带有时间戳,但使用此方法需要循环遍历每个文件以检索结果。每个文件夹有超过80,000个文件。资源很重。
PHP是否有内置函数来执行此操作或者最好这样做?
由于
编辑: 调用像perl这样的后端脚本会更高效,然后将结果返回给PHP。
答案 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'));