yii - 多次使用 Yii::app()->db 的开销?

标签 yii

如果我必须连续执行多个查询,这样做是否更好:

$connection = Yii::app()->db;

一次...然后继续使用 $connection,或者如果我有多个这样的函数,是否会有开销:

function mainFunction() {
  $dbResult1 = dbresult1();
  $dbResult2 = dbresult2();    
  $dbResult2 = dbresult3();
}

function dbresult1() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

function dbresult2() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

function dbresult3() {
   $connection = Yii::app()->db;
   // do stuff
   return $result;
}

这样做会更好吗:

function mainFunction() {
  $connection = Yii::app()->db;
  // do stuff with $connection for $dbResult1
  // do stuff with $connection for $dbResult2
  // do stuff with $connection for $dbResult3
}

最佳答案

您可以跟踪源代码以查看调用 Yii::app()->db 时会发生什么:

Yii::app() 返回 YiiBase 的静态 app 属性。可以看源码here .

public static function app()
{
    return self::$_app;
}

Yii::app()->db 这里变得更有趣了,因为有些东西被查找了。可以看源码here .

public function getDb()
{
    return $this->getComponent('db');
}

getComponent()CModule的一个方法,你可以找到源代码here .

public function getComponent($id,$createIfNull=true)
{
    if(isset($this->_components[$id]))
        return $this->_components[$id];
    elseif(isset($this->_componentConfig[$id]) && $createIfNull)
    {
        $config=$this->_componentConfig[$id];
        if(!isset($config['enabled']) || $config['enabled'])
        {
            Yii::trace("Loading \"$id\" application component",'system.CModule');
            unset($config['enabled']);
            $component=Yii::createComponent($config);
            $component->init();
            return $this->_components[$id]=$component;
        }
    }
}

如您所见,Yii::app()->db 导致了一些方法调用和数组查找。如果性能非常关键,您可能应该缓存数据库实例。否则我会专注于编写干净且可读的代码,而不会关心这样的小调整。

关于yii - 多次使用 Yii::app()->db 的开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088664/

相关文章:

php - 在 Yii 2.0 (Menu::Widget) 中使用跨度?

mysql - Yii 查询优化 MySQL

javascript - slider 卡在第一张幻灯片上

mysql - YII 如何使用 queryRow 函数获取受影响的行数

php - Yii2 在使用公共(public)目录运行多个应用程序时找不到文件

Yii CAPTCHA 网址已损坏

php - 如何在 yii 中打印我的 sql 字符串?

php - cjuidialog 模式窗口上的验证

ajax - Yii 如何通过 ajaxButton 发送组合的选定值?

mysql - 如何解决Yii框架中CDb连接错误