sunnyfriend 发表于 2011-6-17 13:15:12

将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 13:20:01

本帖最后由 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');



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

jeongee 发表于 2011-6-17 13:40:13

呵呵,支持了,希望每次更新都有你的lite出现哈

sunnyfriend 发表于 2011-6-17 13:45:30

jeongee 发表于 2011-6-17 13:40 static/image/common/back.gif
呵呵,支持了,希望每次更新都有你的lite出现哈

我是越俎代庖啊,要是官方的下载包里直接提供这个就更好了。

008shanke 发表于 2011-6-17 16:31:40

这个有助于对CI的深刻认识!

asdfasd 发表于 2011-6-18 21:33:12

:lol楼主做个自动把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内会如何?其它希奇古怪的组合产生结果若与原来不一样的话,虫不易抓!

Hex 发表于 2011-7-11 23:37:22

支持楼主分享精神!

我觉得,开启 OPCode 缓存后,并且关闭文件更新检查,同样可以达到楼主的效果,也就是避免IO。
但是需要有清除 opcode 缓存的机制,呵呵

saturn 发表于 2011-7-12 08:40:56

楼主的分享精神是好的。

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

影响PHP程序性能的地方有很多,比如数据库瓶颈。真正出现在PHP这里的并不多,而且PHP也很难成为性能瓶颈。

cccen 发表于 2011-8-15 22:33:53

确实是一种思路

事实上99%以上的个人站长都不会面对到效率问题(当然垃圾采集站除外)
页: [1]
查看完整版本: 将CodeIgniter_2.0.2的核心代码整合为单个文件,提升速度