PHP: glob()比列出特定文件慢多少?


PHP: How much slower is glob() vs listing specific files?

我有相当多的*.class.php文件在我的/classes目录。随着应用程序的更新,这些可能会发生变化,可能会添加更多内容,也可能会删除一些内容。

我有一个文件,加载每个页面加载,其中包括所有必要的文件。现在,我正在做这个:

$files = glob($site->settings->root_path.'/classes/*.{php}', GLOB_BRACE);
foreach ($files as $file) {
  require_once($file);
}

这是否比单独指定每个文件慢得多?如:

require_once('/path/to/file1.php');
require_once('/path/to/file2.php');
require_once('/path/to/file3.php');

我之所以问这个问题,是因为我想我记得一段时间以前的一些事情,这些事情让我相信遍历文件/文件夹是一个痛苦而缓慢的过程,但我没有办法确定。

编辑:如果有人有比glob更好的建议,我很高兴输入。

回答您的问题:是的,它肯定会更慢,只是因为您首先必须获得文件列表,然后执行require_once,这将对文件系统进行另一次访问,以检查文件是否实际存在。

但我认为这是一种错误的做法。你要做的是通过自动加载来实现的。

基本上,您必须定义一个函数,当脚本想要访问未定义的类时,该函数将尝试从文件系统加载文件。然后,该函数将类的名称(带有名称空间)映射到文件系统上的文件,并尝试加载该文件。这样,您就不必担心文件夹中有多少文件,以及它们添加或删除的频率。

只是为了补充这里已经有的内容,自动加载的PHP文档有以下代码段(但是稍微编辑了一下),它应该非常适合您所做的。

function my_autoloader($class) {
    require_once 'classes/' . $class . '.php';
}
spl_autoload_register('my_autoloader');

例如,如果你在classes/ClassA.php中有一个名为ClassA的类,只需像手动需要它一样构造ClassA。它应该能正常工作。希望这对你有帮助!