2011-02-17 64 views
1

这次很简单的问题,基本上我有一组文件夹,其中一些文件包含我希望在运行我的网站脚本时自动加载的文件。不过,我不想指定要自动加载的文件,因为我希望该过程是动态的,并且我希望能够即时创建和删除不同的文件。 所以当然最简单的解决方案是获取目录中的文件夹列表,并建立自动加载文件的路径,如果文件存在,然后脚本包含它们。 但是,我的问题是会影响我的脚本的性能多少?它实际上是一个我想稍后发布的框架,所以性能是非常重要的。 任何想法?获取目录列表会影响php的性能多少

+0

在您将该数组序列化到缓存文件之后构建列表后,请记住这一点...这实际上是symfony自动加载在1.x系列中的工作原理。 – prodigitalson 2011-02-17 22:30:15

回答

4

你应该考虑简单地让PHP autoload your classes

如果这样做不起作用,那么您几乎只剩下目录扫描解决方案,并且您不应该关心性能损失。如果你想要的功能,你会忍受成本。

一般来说,你不应该在PHP中强调过多的性能。如果在您的框架完成时成为问题,请重新访问它。有机会,你会发现现在通过在你的框架中实现一个好的缓存系统,你现在所带来的任何性能收益/损失都会变得毫无意义。

参见Premature Optimization

1

这取决于您的磁盘速度,文件系统和目录的大小。无论如何,动态加载目录以获取文件列表将比加载静态列表花费更长的时间;增加多少可以接受取决于您的要求。

如果是一个选项,缓存该列表可能会有所帮助。

0

自动加载虽然不是“免费”,但效果不明显。当然,如果需要,你可以测量这个和重构。

这里是我的自动加载磁带机:

spl_autoload_register(
    function ($className) { 
     $possibilities = array(
      APPLICATION_PATH.'beans'.DIRECTORY_SEPARATOR.$className.'.php', 
      APPLICATION_PATH.'controllers'.DIRECTORY_SEPARATOR.$className.'.php', 
      APPLICATION_PATH.'helpers'.DIRECTORY_SEPARATOR.$className.'.php', 
      APPLICATION_PATH.'models'.DIRECTORY_SEPARATOR.$className.'.php', 
      APPLICATION_PATH.'views'.DIRECTORY_SEPARATOR.$className.'.php' 
     ); 
     foreach (explode(PATH_SEPARATOR, ini_get('include_path')) as $k => $v) { 
      $possibilities[] = $v.DIRECTORY_SEPARATOR.$className.'.php'; 
     } 
     foreach ($possibilities as $file) { 
      if (file_exists($file)) { 
       require_once($file); 
       return true; 
      } 
     } 
     return false; 
    } 
); 
0

这要看情况。

试试你的方法和措施。您可以随时添加缓存。或者使用autoload