资讯专栏INFORMATION COLUMN

Yii2性能优化之:类的延迟加载技术介绍

tuniutech / 1801人阅读

摘要:据官方介绍,框架广泛的使用了一种叫做延迟加载的技术,从而达到这样的效果。比如我们在判断中,需要实例化类的时候,再去加载相应的文件。代码如下等于不等于优化过后的文件效率肯定得到了提升,这个也就是类的延迟加载雏形。这就是的延迟加载了。

Yii框架号称最高效的PHP框架,执行效率高出其他框架很多。据官方介绍,Yii框架广泛的使用了一种叫做延迟加载的技术,从而达到这样的效果。

下面我们就通过实例详细的来介绍一下这个技术

类的延迟加载

首先我们在www目录新建2个类Class1Class2和一个index.php文件。

Class1Class2中我们只简单的写一个简单结构

Class1.php

class Class1{

    public function __construct(){
        echo "class1";
    }
    
}

Class2.php

class Class2{

    public function __construct(){
        echo "class2";
    }

}

接下来我们在index.php文件中引入这两个类

require_once("Class1.php");
require_once("Class2.php");

同时我们再定义一个变量$state,将其值设置为1。我们再对$state做一些判断操作。

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    $class2 = new Class2();
}

我们判断$state值,如果为1,则输出一句话和实例化Class1。否则,同样输出一句话,和实例化Class2

代码正常运行。但是我们发现,我们在if中实例化Class1Class2。不管何时,都只能实例化其中的一个,而我们在引入文件的时候,却是一次性的将两个类都引入进来了。这样不可避免的造成了一些资源的浪费。

所以,我们可以先进行一些小的优化。

比如:我们在if判断中,需要实例化类的时候,再去加载相应的文件。代码如下:

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    require_once("Class1.php");
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    require_once("Class2.php");
    $class2 = new Class2();
}

优化过后的index.php文件效率肯定得到了提升,这个也就是类的延迟加载雏形。但是这样就会出现一个问题,在需要加载的文件很多时候,并不是太方便。通用性不是很强。

在Yii中,这个问题被很好的解决。

其核心武器就是spl_autoload_register()函数,该函数可以自动执行函数。
其括号中参数为需要执行的函数的函数名。比如我们定义一个函数,叫fun_loader().然后将fun_loader作为spl_autoload_register()的参数,那么在程序运行时候,就会自动的执行fun_loader函数。

我们先在index.php函数顶部加入代码

function fun_loader($value)
{
    echo "123";
}

spl_autoload_register("fun_loader");

这样程序在运行时候就会自动调用函数fun_loader,并且输出123

有了自动调用函数功能,我们就可以把刚刚的需要加载的两个类放入这个函数,达到自动加载的效果。

function fun_loader($value)
{
    require_once("Class1.php");
    require_once("Class2.php");
}

但是这样还是回归到了之前的情况,多加载了一个无用的类。

所以,fun_loader的参数起作用了,我们可以动态的将需要加载的类传递进来,实现按需加载。

我们将改造后的index.php完整的写出来,如下:

function fun_loader($value)
{
    require_once($value.".php");
}

spl_autoload_register("fun_loader");

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    $class2 = new Class2();
}

这样,当实例化的时候,如果发现没有找到相应的类。那么就会执行一下fun_loader函数。同时,将实例化的类名作为参数,传递给fun_loader

这样就可以实现需要时候加载需要的类。这就是Yii的延迟加载了。

Yii具体的代码在文件vendoryiisoftyii2Yii.php


 * @since 2.0
 */
class Yii extends yiiBaseYii
{
}

spl_autoload_register(["Yii", "autoload"], true, true);
Yii::$classMap = require(__DIR__ . "/classes.php");
Yii::$container = new yiidiContainer();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30423.html

相关文章

  • YII2通过composer优化vendor

    摘要:本文讨论通过工具安装框架并优化过程中遇到的问题,约定读者对基本原理有一定了解,并且有安装框架的实际经验。这个命令是优化包的关键一环。命令要谨慎使用。 本文讨论通过composer工具安装Yii2框架并优化Vendor过程中遇到的问题,约定读者对composer基本原理有一定了解,并且有安装Yii2框架的实际经验。 在Yii2社区里经常会遇到一类问题,那就是 安装完官方推荐的版本后1 ...

    dcr309duan 评论0 收藏0
  • Yii修行路 - Extension 扩展

    摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...

    bovenson 评论0 收藏0
  • Vue.js应用性能优化:第一部分---介绍性能优化和懒加载

    摘要:我的目标是使本系列成为关于应用程序性能的完整指南。代码分割就是将应用程序分割成这些延迟加载的块。总结延迟加载是提高应用程序性能并减少其大小的最佳方法之一。在本系列的下一部分中,我将向您展示如何使用和路由来分割应用程序代码。 当移动优先(mobile-first)的方式逐渐成为一种标准,而不确定的网络环境因素应该始终是我们考虑的一点,因此保持让应用程序快速加载变得越来越困难。在本系列文章...

    ZweiZhao 评论0 收藏0
  • Java设计模式-单例模式(Singleton Pattern)

    摘要:如果需要防范这种攻击,请修改构造函数,使其在被要求创建第二个实例时抛出异常。单例模式与单一职责原则有冲突。源码地址参考文献设计模式之禅 定义 单例模式是一个比较简单的模式,其定义如下: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 或者 Ensure a class has only one instance, and provide a global point of ac...

    k00baa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<