Php exec()vs glob()vs filesystememitter())

Php exec()vs glob()vs filesystememitter()),php,exec,glob,Php,Exec,Glob,以下哪种方法或其他方法最适合用于显示文件? 注意:在本例中,我只对显示文件名感兴趣 另外,文件系统发射器中的项目是如何排序的? 以下三个示例都显示相同的结果,只是filesystememitter没有明显的排序顺序 $path = "/"; exec("ls $path", $results); foreach($results as $file){ p($file); } foreach(glob($path."/*") as $file){ p(basename($file

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

另外,
文件系统发射器中的项目是如何排序的?

以下三个示例都显示相同的结果,只是
filesystememitter
没有明显的排序顺序

$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";
}

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

快速样本:

$dh = opendir("path/to/folder");
while (($file = readdir($dh)) !== false) {
    // filename will be in $file, will include "." and ".."
}
每当你问“最佳”时,你需要定义标准,这样你的主要问题就无法得到回答

不过有一些注意事项:

  • 关于迭代器中的顺序,我想它根本不会以任何方式对文件进行排序,而是以存储在磁盘上的方式传递它们。这可能与opendir()/readdir()(顺便说一句,PHP中有closedir()吗?)。不进行排序是有意义的:当您无论如何都要按不同的属性对其再次排序或根本不需要对其进行排序时,您不会浪费CPU周期
  • 关于第一个(exec(..),它创建了一个新的进程(这很昂贵),运行一个程序(不是每个系统都有,只是POSIX风格的程序),然后以单个字符串的形式返回输出,为了得到单个文件,需要对其进行解析。此外,straight
    ls
    将自己过滤掉隐藏的文件
  • 使用通配符进行全局搜索也是相当昂贵的,特别是如果您根本不想过滤内容的话
默认情况下,我会使用目录迭代器,根据需要对其进行排序,除非某些要求(您尚未提及的要求)另有说明。

这是怎么回事:

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

glob()、opendir/readdir解决方案很好,与filesystememitter相同。这是你的,你会选择什么。利弊如下:

函数,如glob、opendir/readdir,占用的内存更少,因为没有创建任何对象,所以只需获得一个字符串值数组。如果您确信,您唯一需要的就是文件系统中的路径列表,那么这可能很好

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


注:从可用性方面来说,通过FileSystemEmitter的OOP方法是最好的,因为您可以获得对象,其中包含或可以获得有关目标文件/文件夹的许多信息,从简单性方面来说,您可以选择调用函数,例如glob

,这与FileSystemEmitter的输出完全相同,但dotsit不是,FileSystemEmitter返回SplFileObject的集合,只输出文件名,正如我所做的,与thislol没有什么不同,输出是相同的,所以没有什么不同。。。所以字符串数组==对象数组,这就是你所说的吗?对于exec(),如果提供了arg2/$output,那么给定的数组将由命令的每一行输出填充,这就是我要做的。我也不想问涉及exec()的安全问题,如果你费心给出“最佳”的限定定义,你会得到更好的答案。。。
$dh = opendir("path/to/folder");
while (($file = readdir($dh)) !== false) {
    // filename will be in $file, will include "." and ".."
}