用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7300|回复: 9
收起左侧

[核心代码 Core] 将CodeIgniter_2.0.2的核心代码整合为单个文件,提升速度

[复制链接]
发表于 2011-6-17 13:15:12 | 显示全部楼层 |阅读模式
本帖最后由 sunnyfriend 于 2011-6-17 17:45 编辑

require是效率杀手,而且CI每个生命周期都几乎要require core包下的所有文件,所以将core下的文件整合成了单个文件,并去掉空行和注释,适合对效率有追求的开发者,开启php的APC扩展后效率更佳。

注意这个文件是CodeIgniter_2.0.2的核心代码整合而成的。

将下载的 CodeIgniter_lite.php 文件放在CI框架的根目录下, 修改网站入口文件的引用路径就可以了,如下面的例子
PHP复制代码
 
if(defined('ENVIRONMENT') && ENVIRONMENT=='development')
    require_once BASEPATH.'core/CodeIgniter'.EXT;
else
    require_once BASEPATH.'CodeIgniter_lite'.EXT;
 
复制代码


下载CodeIngiter_lite.php CodeIgniter_lite.rar (17.23 KB, 下载次数: 102)




评分

参与人数 3威望 +18 收起 理由
Hex + 6 赞一个!
lamtin + 6 很给力!
jeongee + 6 赞一个!

查看全部评分

 楼主| 发表于 2011-6-17 13:20:01 | 显示全部楼层
本帖最后由 sunnyfriend 于 2011-6-17 17:55 编辑

其实这个不仅仅是简单将 CodeIgniter/core目录下的所有文件整合成一个文件就可以的。需要对两个函数做一点  Hacker。

第一个是Common.php里的 load_class()函数

将里面的
PHP复制代码
 
                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;
                        }
                }
 
 
复制代码

这一段改为
PHP复制代码
 
        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()函数
将里面的这一段
PHP复制代码
 
                        if ( ! class_exists('CI_Model'))
                        {
                                load_class('Model', 'core');
                        }
 
 
复制代码

改为
PHP复制代码
 
                                load_class('Model', 'core');
 
复制代码



至于为什么,欢迎喜欢研究的同学一起讨论啊。

发表于 2011-6-17 13:40:13 | 显示全部楼层
呵呵,支持了,希望每次更新都有你的lite出现哈
 楼主| 发表于 2011-6-17 13:45:30 | 显示全部楼层
jeongee 发表于 2011-6-17 13:40
呵呵,支持了,希望每次更新都有你的lite出现哈

我是越俎代庖啊,要是官方的下载包里直接提供这个就更好了。
发表于 2011-6-17 16:31:40 | 显示全部楼层
这个有助于对CI的深刻认识!
发表于 2011-6-18 21:33:12 | 显示全部楼层
楼主做个自动把CI抽成一个文件的工具吧。
发表于 2011-7-11 21:38:21 | 显示全部楼层
修改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内会如何?其它希奇古怪的组合产生结果若与原来不一样的话,虫不易抓!
发表于 2011-7-11 23:37:22 | 显示全部楼层
支持楼主分享精神!

我觉得,开启 OPCode 缓存后,并且关闭文件更新检查,同样可以达到楼主的效果,也就是避免IO。
但是需要有清除 opcode 缓存的机制,呵呵
发表于 2011-7-12 08:40:56 | 显示全部楼层
楼主的分享精神是好的。

不过我不太赞成在生产环境下对CI的Core做大规模修改(除非这个项目有专门的人维护底层框架),主要是这么做不利于后期程序升级,目前Reactor的改动和推进非常快。

影响PHP程序性能的地方有很多,比如数据库瓶颈。真正出现在PHP这里的并不多,而且PHP也很难成为性能瓶颈。
发表于 2011-8-15 22:33:53 | 显示全部楼层
确实是一种思路

事实上99%以上的个人站长都不会面对到效率问题(当然垃圾采集站除外)

本版积分规则