CodeIgniter - 如果尚未加载库,则加载库

ltd*_*dev 6 php codeigniter libraries codeigniter-classloader

我想要做的是加载库,如果它们尚未加载(CI的库,或者是自定义的库)在网站的许多不同点上.所以我想对此进行检查.

我已经在Loader库上搜索并找到了is_loaded()函数,所以我可以这样做:

if ($this->load->is_loaded('form_validation') === false) {
    $this->load->library('form_validation');            
}
Run Code Online (Sandbox Code Playgroud)

这个奇怪的事情(启用了探查器)是内存上升,这让我想知道这是不是正确的方式.

Hrv*_*cic 17

在system/core/Loader.php的第914行附近,Codeigniter执行检查库是否已加载且不会再次加载库.但是,这些检查也会占用一些内存.为了总结哪种方式最适合加载库,我做了一点基准测试(每次尝试后清理内存),这里的结论是:

只需正常加载库,$this->load...然后让Codeigniter处理它


基准测试:

$this->load->library('session');
Run Code Online (Sandbox Code Playgroud)

在初始加载Codeigniter会话类之后,我测试了各种加载库和/或检查它是否已经加载的方法.这些行中的每一行分别执行20次:


记忆消耗测试(不是速度!)

if(!$this->load->is_loaded('session')) $this->load->library('session');
Run Code Online (Sandbox Code Playgroud)

这消耗了48.256个字节


if(!class_exists('ci_session')) $this->load->library('session');
Run Code Online (Sandbox Code Playgroud)

这消耗了39.824bytes


if(!isset($this->session)) $this->load->library('session');
Run Code Online (Sandbox Code Playgroud)

这消耗了31.904bytes


$this->load->library('session');
Run Code Online (Sandbox Code Playgroud)

这消耗了21.790bytes


重复测试一次后,结果是一样的,所以我猜它可能是相关的!如果我错了请评论!


2014年7月8日.使用Codeigniter 2.2.0进行更新:使用1000次迭代(不像以前那样20次)重复测试.结果保持不变.内存消耗如下:2128b,1856b,1688b,1456b

@Tim Dev在评论中指出,该基准测试不需要显示最快的代码,但只显示最低的内存消耗代码.

  • 通过重新加载方法100次尝试加载相同的库来对此进行基准测试.`!class_exists()`1.95毫秒,`!isset()`5.6毫秒,`!is_loaded()`39毫秒,没有检查但只是信任codeigniter检查是300 +毫秒.所以`class_exists`更快. (3认同)