exec()vs glob()vs FilesystemIterator()

时间:2013-10-16 05:33:49

标签: php exec glob

哪种方法或其他方法最适合用于显示文件? 注意:在这个例子中,我只对显示文件名感兴趣。

另外,FilesystemIterator中的项目如何排序?

以下三个示例都显示相同的结果,但FilesystemIterator没有明显的排序顺序。

$path = "/";
exec("ls $path", $results);
foreach($results as $file){
    p($file);
}

foreach(glob($path."/*") as $file){
    p(basename($file)   );
}

foreach(new FilesystemIterator($path) as $file){
    p($file->getFilename());
}


function p($s){
    global $path;
    echo "<a href=\"$path?f=$s\">$s</a><BR>\n";
}

输出:

exec("ls ...") method
bin
boot
cdrom
dev
etc
home
initrd.img
...


glob() method
bin
boot
cdrom
dev
etc
home
initrd.img
...


FilesystemIterator() method
mnt
vmlinuz
cdrom
usr
sys
home
var
...

3 个答案:

答案 0 :(得分:1)

这个怎么样:

exec() - 是最糟糕的解决方案,因为如果用户可以管理在exec输入参数中输入自定义字符串,它会在您的应用程序中创建潜在的安全漏洞。出于这个原因,大多数主机阻止您使用exec,因此如果您将应用程序部署到您不拥有的某个主机,则可以阻止此命令。

glob(),opendir / readdir解决方案很好,与FilesystemIterator相同。这是你的,你会选择什么。优点和缺点是这些:

函数,例如glob,opendir / readdir消耗更少的内存,因为没有创建对象,只需获取一个字符串值数组。如果您确定,这可能是好的,您只需要文件系统中的路径列表。

FilesystemIterator为您提供了SplFileInfo对象的集合,这些对象为每个项目提供了一组完整的方法,例如getExtension,getFullPath,getFilename,这使得使用文件/文件夹执行某些高级任务非常容易。

Ps。:在可用性方面最好的是通过FilesystemIterator的OOP方法,因为你得到的对象,保存或者可以获得关于目标文件/文件夹的许多信息,在简单性方面你可以选择调用函数,例如glob < / p>

答案 1 :(得分:0)

我不确定您给出的方法的优缺点,但PHP确实为您提供了一组处理目录的函数。

http://www.php.net/manual/en/ref.dir.php

快速样本:

$dh = opendir("path/to/folder");
while (($file = readdir($dh)) !== false) {
    // filename will be in $file, will include "." and ".."
}

答案 2 :(得分:0)

每当您要求“最佳”时,您需要定义标准,因此无法回答您的主要问题。

但有些注意事项:

  • 关于迭代器中的顺序,我想它不会以任何方式对文件进行排序,而是以它们存储在磁盘上的方式传递它们。这可能与opendir()/ readdir()(在PHP中有一个closedir(),btw?)正在做什么相同。不排序是有道理的:当你打算用不同的属性再次对它进行排序或根本不需要排序时,你不会浪费CPU周期。
  • 关于第一个(exec(..)),它创建一个新进程(价格昂贵),运行一个程序(甚至不存在于每个系统上,只有POSIX风格的程序),然后返回输出作为单个字符串,您需要解析以获取单个文件。此外,直接ls将自行过滤掉所有隐藏文件。
  • 使用通配符进行拼贴也相当昂贵,特别是如果您根本不想过滤掉事物。

我默认使用目录迭代器,根据需要对其进行排序,除非有些要求(那些你还没有提到的要求)另有说明。