将CodeIgniter_2.0.2的核心代码整合为单个文件,提升速度
本帖最后由 sunnyfriend 于 2011-6-17 17:45 编辑require是效率杀手,而且CI每个生命周期都几乎要require core包下的所有文件,所以将core下的文件整合成了单个文件,并去掉空行和注释,适合对效率有追求的开发者,开启php的APC扩展后效率更佳。
注意这个文件是CodeIgniter_2.0.2的核心代码整合而成的。
将下载的 CodeIgniter_lite.php 文件放在CI框架的根目录下, 修改网站入口文件的引用路径就可以了,如下面的例子
if(defined('ENVIRONMENT') && ENVIRONMENT=='development')
require_once BASEPATH.'core/CodeIgniter'.EXT;
else
require_once BASEPATH.'CodeIgniter_lite'.EXT;
下载CodeIngiter_lite.php
本帖最后由 sunnyfriend 于 2011-6-17 17:55 编辑
其实这个不仅仅是简单将 CodeIgniter/core目录下的所有文件整合成一个文件就可以的。需要对两个函数做一点Hacker。
第一个是Common.php里的 load_class()函数
将里面的
foreach (array(BASEPATH, APPPATH) as $path)
{
if (file_exists($path.$directory.'/'.$class.EXT))
{
$name = $prefix.$class;
if (class_exists($name) === FALSE)
{
require($path.$directory.'/'.$class.EXT);
}
break;
}
}
这一段改为
if($directory=='core'&&$prefix=='CI_')
{
$name=$prefix.$class;
$dirs=array(APPPATH);
}
else
$dirs=array(BASEPATH, APPPATH);
foreach ($dirs as $path)
{
if (file_exists($path.$directory.'/'.$class.EXT))
{
$name = $prefix.$class;
if (class_exists($name) === FALSE)
{
require($path.$directory.'/'.$class.EXT);
}
break;
}
}
第二个是 Loader.php里的CI_Loader::model()函数
将里面的这一段
if ( ! class_exists('CI_Model'))
{
load_class('Model', 'core');
}
改为
load_class('Model', 'core');
至于为什么,欢迎喜欢研究的同学一起讨论啊。
呵呵,支持了,希望每次更新都有你的lite出现哈 jeongee 发表于 2011-6-17 13:40 static/image/common/back.gif
呵呵,支持了,希望每次更新都有你的lite出现哈
我是越俎代庖啊,要是官方的下载包里直接提供这个就更好了。 这个有助于对CI的深刻认识! :lol楼主做个自动把CI抽成一个文件的工具吧。 修改index.php并非好建议,应把CodeIgniter_lite.php直接名命为CodeIgniter.php,把原来的CodeIgniter.php改名为CodeIgniter-original.php,再把下载的CodeIgniter.php放在system/core内便可。又或直接把system/core改为system/core-original再取代。修改名字比修改内容来得容易还原。
简单测试,用的是低端PC。原有页执行平均约0.09秒,使用压缩版平均约0.08秒,是快了些。
估计是拿走foreach loop及结合了零散I/O的结果。但猜想是整体快了约0.01秒而非约10%。
把load_class的逻辑进行修改得非常小心,不敢肯定会否在所有情况下都会产生与原来相同结果。假如有把握,为何不建议上游修改?
Model的load_class是否真的的百份百不用检查class_exists,要多测试些。例如有人把自己写的CI_Model放在application/core内,甚至libraries内会如何?其它希奇古怪的组合产生结果若与原来不一样的话,虫不易抓! 支持楼主分享精神!
我觉得,开启 OPCode 缓存后,并且关闭文件更新检查,同样可以达到楼主的效果,也就是避免IO。
但是需要有清除 opcode 缓存的机制,呵呵 楼主的分享精神是好的。
不过我不太赞成在生产环境下对CI的Core做大规模修改(除非这个项目有专门的人维护底层框架),主要是这么做不利于后期程序升级,目前Reactor的改动和推进非常快。
影响PHP程序性能的地方有很多,比如数据库瓶颈。真正出现在PHP这里的并不多,而且PHP也很难成为性能瓶颈。 确实是一种思路
事实上99%以上的个人站长都不会面对到效率问题(当然垃圾采集站除外)
页:
[1]