资讯专栏INFORMATION COLUMN

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

tuniutech / 2001人阅读

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

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

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

类的延迟加载

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

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

</>复制代码

  1. Class1.php
  2. class Class1{
  3. public function __construct(){
  4. echo "class1";
  5. }
  6. }
  7. Class2.php
  8. class Class2{
  9. public function __construct(){
  10. echo "class2";
  11. }
  12. }

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

</>复制代码

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

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

</>复制代码

  1. $state = 1;
  2. if($state == 1)
  3. {
  4. echo "state 等于 1";
  5. $class1 = new Class1();
  6. }
  7. else
  8. {
  9. echo "state 不等于 1";
  10. $class2 = new Class2();
  11. }

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

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

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

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

</>复制代码

  1. $state = 1;
  2. if($state == 1)
  3. {
  4. echo "state 等于 1";
  5. require_once("Class1.php");
  6. $class1 = new Class1();
  7. }
  8. else
  9. {
  10. echo "state 不等于 1";
  11. require_once("Class2.php");
  12. $class2 = new Class2();
  13. }

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

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

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

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

</>复制代码

  1. function fun_loader($value)
  2. {
  3. echo "123";
  4. }
  5. spl_autoload_register("fun_loader");

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

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

</>复制代码

  1. function fun_loader($value)
  2. {
  3. require_once("Class1.php");
  4. require_once("Class2.php");
  5. }

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

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

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

</>复制代码

  1. function fun_loader($value)
  2. {
  3. require_once($value.".php");
  4. }
  5. spl_autoload_register("fun_loader");
  6. $state = 1;
  7. if($state == 1)
  8. {
  9. echo "state 等于 1";
  10. $class1 = new Class1();
  11. }
  12. else
  13. {
  14. echo "state 不等于 1";
  15. $class2 = new Class2();
  16. }

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

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

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

</>复制代码

  1. * @since 2.0
  2. */
  3. class Yii extends yiiBaseYii
  4. {
  5. }
  6. spl_autoload_register(["Yii", "autoload"], true, true);
  7. Yii::$classMap = require(__DIR__ . "/classes.php");
  8. 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元查看
<