日期:2014-05-17  浏览次数:20514 次

PHP5的自动加载的效率问题
自动加载是当调用了一个类。但是没有显式的require时会自动去目录里找对应的PHP类文件。
请问在我多个FUNCTION或者多个页面中都有用到这个类时是不是每次都会去硬盘上找这一个文件。那这样是不是就加大了硬盘IO的开销?
如果显式require_once是不是就是就一次IO的开销。不知大家开发项目时如何处理?

------解决方案--------------------
是的,多个页面中都有用到这个类时是不是每次都会去硬盘上找这一个文件
同样的,显式require_once时同样是每次都会去硬盘上找这一个文件

于是就有了一些扩展库,用来缓存这些频繁加载的文件
------解决方案--------------------
autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。  
通常PHP5在使用一个类时,假如发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。
使用autoload机制时,很多人的第一反应就是使用autoload会降低系统效率,甚至有人干脆提议为了效率不要使用autoload。在我们了解了autoload实现的原理后,我们知道autoload机制本身并不是影响系统效率的原因,甚至它还有可能进步系统效率,由于它不会将不需要的类加载到系统中()。 
  那么为什么很多人都有一个使用autoload会降低系统效率的印象呢?实际上,影响autoload机制效率本身恰正是用户设计的自动加载函数。假如它不能高效的将类名与实际的磁盘文件(留意,这里指实际的磁盘文件,而不仅仅是文件名)对应起来,系统将不得不做大量的文件是否存在(需要在每个include path中包含的路径中往寻找)的判定,而判定文件是否存在需要做磁盘I/O操纵,众所周知磁盘I/O操纵的效率很低,因此这才是使得autoload机制效率降低的罪魁罪魁! 
  因此,我们在系统设计时,需要定义一套清楚的将类名与实际磁盘文件映射的机制。这个规则越简单越明确,autoload机制的效率就越高。 
  结论:autoload机制并不是自然的效率低下,只有滥用autoload,设计不好的自动装载函数才会导致其效率的降低。